Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0710: Symbolnamen dekodieren

 von 

Beschreibung 

Symbolnamen, wie sie z.B. aus DLLs exportiert werden, liegen nicht in Klartext vor, sondern sind speziell kodiert. Mit ein paar Aufrufen der Win32-API lassen sich diese jedoch leicht in die
ursprüngliche Form als C-Header umwandeln.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

GetCurrentProcess, SymInitialize, SymSetOptions, UnDecorateSymbolName

Download:

Download des Beispielprojektes [3,24 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Projekt1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "cmdDecode"
' Steuerelement: Rahmensteuerelement "Frame1"
' Steuerelement: Textfeld "txtHeader" auf Frame1
' Steuerelement: Kombinationsliste "cboDecSymbol" auf Frame1
' Steuerelement: Beschriftungsfeld "Label2" auf Frame1
' Steuerelement: Beschriftungsfeld "Label1" auf Frame1
' Steuerelement: Beschriftungsfeld "lblResult"
' Steuerelement: Beschriftungsfeld "Label3"

Option Explicit

Private Sub cmdDecode_Click()
   Dim DecSymbolName As String   ' "Dekorierter" Symbolname
   Dim PureSymbol    As String   ' Dekodierter Name
   Dim Result        As Boolean  ' Ergebnis
   
   DecSymbolName = cboDecSymbol.Text
   
   If DecSymbolName <> "" Then
      Result = mdlSymbols.DecodeSymbolName(DecSymbolName, PureSymbol)
      
      lblResult = IIf(Result, "Aufruf erfolgreich", "Fehler")
      
      txtHeader.Text = PureSymbol
      
   Else
      lblResult = "Fehler: Leerer String"
   End If
   
End Sub

Private Sub Form_Initialize()
   Call mdlSymbols.Initialize
   Call InitializeCombo
End Sub

Private Sub InitializeCombo()
   With cboDecSymbol
      .AddItem "?MeineFunktion@@YIPAIQBDAAHP6GXAAPBQAUHWND__@@P6APAOI@Z@Z@Z"
      .AddItem "?Main@@YAHXZ"
   End With
End Sub

Private Sub Form_Unload(Cancel As Integer)
   Call mdlSymbols.Shutdown
End Sub

'---------- Ende Formular "Form1" alias Form1.frm  ----------
'------ Anfang Modul "mdlSymbols" alias mdlSymbols.bas ------

Option Explicit

' API-Funktionen
Public Declare Function UnDecorateSymbolName Lib "dbghelp.dll" ( _
                 ByVal DecoratedName As String, _
                 ByVal UnDecoratedName As String, _
                 ByVal UndecoratedLength As Long, _
                 ByVal Flags As Long) As Long
                 
Public Declare Function SymInitialize Lib "dbghelp.dll" ( _
                 ByVal hProcess As Long, _
                 ByVal UserSearchPath As String, _
                 ByVal fInvadeProcess As Long) As Long
                 
Public Declare Function SymSetOptions Lib "dbghelp.dll" ( _
                 ByVal SymOptions As Long) As Long
                 
Public Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long

' Konstanten
Global Const SYMOPT_UNDNAME        As Long = &H2
Global Const SYMOPT_DEFERRED_LOADS As Long = &H4

' Vorherige Optionen
Private PrevOptions As Long
                 

' Handler initialisieren
Public Sub Initialize()
   Dim hProcess   As Long  ' Unser Prozess

   ' Optionen setzen und alte Einstellungen sichern
   PrevOptions = SymSetOptions(SYMOPT_UNDNAME Or SYMOPT_DEFERRED_LOADS)

   ' Unseren Prozesshandle abfragen
   hProcess = GetCurrentProcess()

   ' Symbolhandler initialisieren
   Call SymInitialize(hProcess, 0&, 1)
End Sub

' Vorherige Optionen wiederherstellen
Public Sub Shutdown()
   Call SymSetOptions(PrevOptions)
End Sub

' Symbolnamen dekodieren
Function DecodeSymbolName(ByVal DecoratedSymbolName As String, ByRef Buffer As String) As Boolean
   Dim RetVal     As Long  ' Ergebnis der Funktion

   Buffer = Space(1024)    ' Speicher reservieren

   ' Funktion aufrufen (Referenz!)
   RetVal = UnDecorateSymbolName(DecoratedSymbolName, Buffer, 1024, 0&)
   
   ' Status der Funktion
   DecodeSymbolName = (RetVal <> 0)
End Function
'------- Ende Modul "mdlSymbols" alias mdlSymbols.bas -------
'-------------- Ende Projektdatei Projekt1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.