ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 08.02.2001

Diese Seite wurde zuletzt aktualisiert am 08.02.2001
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicAddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zur AVB-Web-Site, Kontakt und Impressum

Zurück...

Native-Code oder P-Code?

Zurück...

(-hg) mailto:hg_compilationtest@aboutvb.de

Sie möchten feststellen, ob eine ausführbare Datei (EXE, DLL, OCX) mit Visual Basic geschrieben und kompiliert wurde? Und wenn ja, ob es ein P-Code-Kompilat oder ein Native-Code-Kompilat ist? Das ist kein großes Problem. Ist es nämlich ein VB-Kompilat, ist irgendwo (die genaue Stelle ist völlig uninteressant) in der Datei die Zeichenfolge "__vba" (ASCII, nicht Unicode!) zu finden. Ist es ein P-Code-Kompilat, ist diese Zeichenfolge nur einmal vorhanden. Ist es ein Native-Code-Kompilat, ist diese Zeichenfolge mehrfach vorhanden.

Das folgende kleine Progrämmchen untersucht eine Datei (EXE, DLL, OCX), deren Pfad in der Kommandozeile (Command$) übergeben wird und gibt eine entsprechende Meldung aus. Sicherheitshalber wird auch geprüft, ob überhaupt ein gültiger Datei-Pfad übergeben worden ist (siehe auch Sein oder nicht sein"Sein oder nicht sein").

Public Sub Main()
  Dim nFNr As Integer
  Dim nText As String
  Dim nFound As Long
  Dim nCount As Integer
  Dim nCommand As String
  
  Const kTitle = "VB-Kompilat prüfen"
  
  nCommand = Command$
  If Left$(nCommand, 1) = Chr$(34) Then
    nCommand = Mid$(nCommand, 2, Len(nCommand) - 2)
  End If
  If zExistFileDirDrive(nCommand) Then
    Select Case UCase$(Right$(nCommand, 4))
      Case ".EXE", ".DLL", ".OCX"
        nFNr = FreeFile
        Open nCommand For Binary Access Read As #nFNr
          nText = Space$(LOF(nFNr))
          Get #nFNr, , nText
        Close #nFNr
        nFound = 1
        Do
          nFound = InStr(nFound + 1, nText, "__vba", vbTextCompare)
          If nFound Then
            If nCount Then
              nCount = nCount + 1
              Exit Do
            Else
              nCount = nCount + 1
            End If
          Else
            Exit Do
          End If
        Loop
        Select Case nCount
          Case 0
            MsgBox nCommand & vbCrLf & vbCrLf & _
             "ist kein VB-Kompilat", , kTitle
          Case 1
            MsgBox nCommand & vbCrLf & vbCrLf & _
             "ist ein VB-P-Code-Kompilat", , kTitle
          Case Else
            MsgBox nCommand & vbCrLf & vbCrLf & _
             "ist ein VB-Native-Code-Kompilat", , kTitle
        End Select
      Case Else
        MsgBox "Datei ist keine EXE...", , kTitle
    End Select
  Else
    MsgBox "Ungültige Übergabe an Kommandozeile:" _
     & vbCrLf & vbCrLf & nCommand, , kTitle
  End If
End Sub

Private Function zExistFileDirDrive(FilePathName As String) _
 As Boolean

  Dim nTest As String

  nTest = LCase$(FilePathName)
  If Len(nTest) = 1 Then
    Select Case Left$(nTest, 1)
      Case "a" To "z"
        nTest = FilePathName & ":\"
    End Select
  ElseIf Len(nTest) = 2 Then
    Select Case Left$(nTest, 2)
      Case "a:" To "z:"
        nTest = FilePathName & "\"
    End Select
  End If
  On Error Resume Next
  zExistFileDirDrive = CBool(GetAttr(nTest) Or vbNormal _
   Or vbHidden Or vbSystem Or vbArchive Or vbDirectory)
End Function

Damit das Progrämmchen, das ja kein Form enthält, ein eigenes Icon haben kann, ist eine Ressourcen-Datei hinzugefügt, die ein Icon mit der Ressourcen-ID "1" (mit Anführungszeichen!) haben muss (siehe auch: Icon aus dem Nichts"Icon aus dem Nichts").

Kompilieren Sie dieses Projekt und legen Sie eine Verknüpfung darauf auf dem Desktop oder in der Schnellstart-Symbolleiste an. Dann können Sie eine ausführbare Datei zum Prüfen aus dem Explorer auf diese Verknüpfung ziehen. Sie können aber auch eine Erweiterung der Kontextmenüs der drei ausführbaren Datei-Typen anlegen und so zu einer Datei deren Prüfung veranlassen. Die entsprechenden Registrierungseinträge könnten etwa wie folgt aussehen, beispielsweise für EXE-Dateien:

[HKEY_CLASSES_ROOT\.exe]
@="exefile"

[HKEY_CLASSES_ROOT\exefile\shell\vbkompilat]
@="Test VB-Kompilat"

[HKEY_CLASSES_ROOT\exefile\shell\vbkompilat\command]
@="D:\\Programme\\aVB\\avbCompilationTest.exe \"%1\""

Das Projekt avbCompilationTest (VB 5 und VB 6) (compilationtest.zip - ca. 5,8 KB)



Komponenten-Übersicht

Schnellsuche




Zum Seitenanfang

Copyright © 1999 - 2023 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...