vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Brandneu! sevEingabe v3.0 - Das Eingabecontrol der Superlative!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Verschiedenes / Sonstiges   |   VB-Versionen: VB604.07.05
Erstellen von Compiler-Listing-Dateien

Anforderung von Compiler-Listing-Dateien beim Erstellen von Systemcode

Autor:   Manfred BohnBewertung:     [ Jetzt bewerten ]Views:  17.210 
ohne HomepageSystem:  WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11kein Beispielprojekt 

Wer mit VC++ arbeitet kennt Compiler-Listing-Dateien. Sie enthalten die Kombination von Quellcode und zugehörigen Assembler-Anweisungen. Diese Dateien können beim Kompilieren eines Programms erstellt werden.

Die VB6-IDE enthält keine Option, durch die man ein Listing-File anfordern kann, obwohl der in VB6 verwendete C-Compiler zur Erstellung von Native-Code (Systemcode) diese Möglichkeit bietet.

Wenn man sich nicht auf die Suche nach Add-Ins machen möchte, die das Erstellen von Listings erlauben, kann man statt dessen auf ein relativ einfaches Verfahren zurückgreifen.

  1. Erstellen Sie ein neues Standard-Exe-Projekt und fügen Sie ein Standardmodul hinzu.
  2. Entfernen Sie das Formular 'Form1' aus dem Projekt.
  3. Kopieren Sie den beigefügten Quellcode in das Standardmodul.
  4. Übersetzen Sie das Projekt.
  5. Gehen Sie in das Stammverzeichnis von VB6 (meist: "C:\Programme\Microsoft Visual Studio\VB98" oder ähnlich) und benennen Sie die Datei 'C2.EXE' (das ist der Compiler!) in 'VBC.EXE' um.
  6. Kopieren Sie die unter 4.) erstellte EXE-Datei in das VB6-Verzeichnis und nennen Sie sie 'C2.EXE'.

Ab sofort werden alle Compileraufrufe der VB-IDE von C2.EXE abgefangen und Sie werden gefragt, ob Sie ein Listing-File erstellen möchten. Falls Sie bejahen, wird im Pfad des jeweils übersetzten Moduls ein File mit der Extension '.LST' vom Compiler erstellt (nur beim Erstellen von Native-Code). Ein bereits bestehendes gleichnamiges Listing-File wird stets gelöscht.

Falls Sie diese Änderungen rückgängig machen möchten, löschen Sie die Datei 'C2.EXE' und benennen Sie 'VBC.EXE' wieder in 'C2.EXE' um.

Sie können den Meldebox-Aufruf im Code auskommentieren. In diesem Fall werden immer Listing-Files zu allen übersetzten Code-Dateien erstellt. Bereits bestehende Listing-Files werden jeweils automatisch vom Compiler überschrieben; falls Schreibschutz gesetzt ist, wird eine Warnung angezeigt.

Hinweise:

  • Es können nur Listings erstellt werden von VB-Quellcode-Dateien, die vor dem Kompilieren auf Festplatte gespeichert worden sind. Anderenfalls bricht der Compiler ab, weil er die Quellcode-Datei nicht findet; der Linker meldet in diesem Fall 'beschädigte Objekt-Datei'.
     
  • Der VB6-Compiler akzeptiert eine Reihe von Steuerungs-Switches, die von der VB-IDE nicht gesetzt werden. Die Verwendung von Optimierungs-Optionen (-Oa -Og -Op -Os -Ot -Ow -Oy) bringt aber keinen zusätzlichen Vorteil gegenüber den Optionen, die auch die IDE anbietet (unter: 'Weitere Optimierungen' ...).
     
  • Der VB6-Compiler akzeptiert nicht alle Switches, die in der Compiler-Referenz zu VC++ aufgeführt sind. Die Optionen zum Durchreichen von Anweisungen vom Compiler an den Linker werden zwar akzeptiert, aber vom Linker ignoriert.

' ====================================================================
' Programm, das die IDE-Compileraufrufe abfängt und
' die Option für eine LISTING-Datei hinzufügt (falls gewünscht)
 
' Schritt-Folge:
' 1. Dieses Programm übersetzen ('Sub Main')
' 2. VB6-Compiler 'C2.Exe' in VBC.EXE umbenennen
' 3. Dieses Programm muss 'C2.EXE' genannt und
'    in den VB6-Ordner kopiert werden
' ====================================================================
 
Option Explicit
 
' vereinfachte UDTs für die Prozess-Erzeugung
Private Type PROCESS_INFO
  hProcess As Long
  x(1 To 12) As Byte
End Type
 
Private Type STARTUP_INFO
  Size As Long
  Reserved As String
  Desktop As String
  Title As String
  x(1 To 28) As Byte
  Flags As Long
  Show As Integer
  y(1 To 16) As Byte
End Type
 
' API-Funktionen für die Prozess-Erzeugung
Private Declare Function CreateProcess Lib "Kernel32" _
  Alias "CreateProcessA" ( _
  ByVal AppName As Long, _
  ByVal CmdLine As String, _
  ByVal ProcAttr As Long, _
  ByVal ThreadAttr As Long, _
  ByVal InheritedHandle As Long, _
  ByVal CreationFlags As Long, _
  ByVal Env As Long, _
  ByVal CurDir As Long, _
  Startup As STARTUP_INFO, _
  Process As PROCESS_INFO) As Long
 
Private Declare Function WaitForSingleObject Lib "Kernel32" ( _
  ByVal Handle As Long, _
  ByVal MilliSeconds As Long) As Long
 
Private Declare Function CloseHandle Lib "Kernel32" ( _
  ByVal Object As Long) As Long
 
' Rückgabe von WaitForSingleObject
Private Const WAIT_TIMEOUT = 258&
Private Const WAIT_FAILED = &HFFFFFFFF
Private Const INFINITE = &HFFFFFFFF
 
Const cTitel As String = "VB-Kompilierung (Systemcode)"
Private Sub Main()
  Dim r As Integer                           ' Dialog-Reaktion
  Dim t1 As Long, t2 As Long                 ' Position Dateiname
  Dim out_dat As String, lst_dat As String   ' Pfad-/Dateiname
  Dim dat As String, d() As String           ' Dateiname (Dialog)
  Dim CmdLine As String, CmdLineO As String  ' Kommandozeile
 
  ' Abfrage des IDE-Compileraufrufs
  CmdLineO = Command()
 
  If Trim(CmdLineO) <> "" Then
    ' Name des zu kompilierenden Files
    t1 = InStr(CmdLineO, "-f")
    t2 = InStr(t1 + 5, CmdLineO, Chr(34))
 
    ' Pfad- und Dateinamen aus Kommandozeile lesen
    If t1 > 0 And t2 > t1 + 10 Then
       out_dat = Mid$(CmdLineO, t1 + 4, t2 - (t1 + 4))
       ' Name der zugehörigen Listing-Datei (.LST)
       lst_dat = out_dat + ".LST"
    End If
 
    If out_dat <> "" Then
      On Error Resume Next
      ' bestehendes List-File ggf. löschen
      Kill lst_dat
      DoEvents
      On Error GoTo 0
 
      dat = Dir(lst_dat, vbNormal Or vbReadOnly Or vbHidden)
      If dat <> "" Then
        MsgBox "Warnung: bestehendes Listing " + vbCrLf + lst_dat + vbCrLf + _
          "kann nicht gelöscht werden", vbExclamation, cTitel
        CmdLine = CmdLineO
      Else
        ' Listfile anfordern (Compiler-Option  FAcs und Fa)
        CmdLine = Replace(CmdLineO, "-basic", "-basic -FAcs -Fa" + _
          Chr(34) + lst_dat + Chr(34))
 
        ' **********************************************************
        ' Dialog: Abfragen ob Listfile gewünscht wird
        d() = Split(out_dat, "\")
        dat = d(UBound(d))
        r = MsgBox("Übersetzung: " + vbCrLf + dat$ + vbCrLf + _
          vbCrLf + "Listfile erzeugen?", vbQuestion + vbYesNo, cTitel)
 
        If r = vbNo Then
          ' Zurücksetzen des Compiler-Aufrufs
          CmdLine = CmdLineO
        End If
        ' ***********************************************************
      End If
      ' Melde-Box beenden lassen
      DoEvents
    End If
 
    ' VB6-Compiler aufrufen: umbenannt als 'VBC.EXE'
    ShellWait App.Path + "\VBC.exe " + CmdLine
  End If      
End Sub
Public Function ShellWait(ByVal Execute As String) As Boolean
  ' Funktion erstellt einen Prozess und wartet
  ' bis der Prozess sich meldet
 
  Dim Prc As PROCESS_INFO                ' Infos zum erstellten Prozess
  Dim Startup As STARTUP_INFO            ' Prozess-Start-Infos
  Dim Ret As Long                        ' API-Rückgabe
 
  Const MilliSeconds As Long = INFINITE  ' unbegrenzt warten
 
  ' Initialisierung Prozess-Start
  With Startup
    .Size = Len(Startup)
    .Flags = 1
  End With
 
  ' Prozess generieren
  Ret = CreateProcess(0&, Execute, 0&, 0&, 1&, &H20&, 0&, 0&, Startup, Prc)
  If Ret = 0 Then
    MsgBox "Warnung: Kompilierung lässt sich nicht starten", vbCritical, cTitel
    DoEvents
    Exit Function
  End If
 
  ' Kompilierung abwarten
  Ret = WaitForSingleObject(Prc.hProcess, MilliSeconds)
  If Ret = WAIT_FAILED Or Ret = WAIT_TIMEOUT Then
    MsgBox "Warnung: Compiler reagiert nicht", vbCritical, cTitel
    DoEvents
  End If
 
  ' Prozess-Handle freigeben
  CloseHandle Prc.hProcess        
End Function
' ===========================================================================

Dieser Tipp wurde bereits 17.210 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel