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").
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").
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\""
|