';SymEnumSymbols';API只检索每个方法名称的第一个字母 我使用了一个解决方案来从非托管C++库中检索方法名称,解决方案使用了代码> SypRealEdsEsMyBurs64 < /Cuth>函数,但是MSDN表示应用程序必须使用 SythMultSuth,所以我找到了其他解决方案,但是,当我尝试将C#代码改编并转换为VB.NET代码时,SYMBOL\u INFO.Name属性只包含方法名称的第一个字母

';SymEnumSymbols';API只检索每个方法名称的第一个字母 我使用了一个解决方案来从非托管C++库中检索方法名称,解决方案使用了代码> SypRealEdsEsMyBurs64 < /Cuth>函数,但是MSDN表示应用程序必须使用 SythMultSuth,所以我找到了其他解决方案,但是,当我尝试将C#代码改编并转换为VB.NET代码时,SYMBOL\u INFO.Name属性只包含方法名称的第一个字母,c#,.net,vb.net,dll,dbghelp,C#,.net,Vb.net,Dll,Dbghelp,问题在哪里?我如何解决 我认为问题可能在于结构内部的声明: <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=1024I)> Public Name As String 我发现你的代码有一些问题 符号信息 应定义为类。VB.NET结构与C++结构不一样, 公共保留区1作为ULong 作为乌龙的公共储备2 作为一个整体的公共储备3 只有两个保留字,不是三个 ULONG64保留[2]; SymEnumSymbolsProc ByRef p

问题在哪里?我如何解决

我认为问题可能在于结构内部的声明:

<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=1024I)>
Public Name As String

我发现你的代码有一些问题

符号信息

应定义为类。VB.NET结构与C++结构不一样,

公共保留区1作为ULong
作为乌龙的公共储备2
作为一个整体的公共储备3

只有两个保留字,不是三个

ULONG64保留[2];
SymEnumSymbolsProc

ByRef pSymInfo作为符号
应该是指向通过val传递的符号信息结构的指针

\u在PSYMBOL\u信息pSymInfo中,


样本表格

导入System.Runtime.InteropServices
导入System.ComponentModel
公开课表格1
私有子HandleLoad(发送者作为对象,e作为EventArgs)处理MyBase.Load
Dim[错误]作为异常=无
Dim初始化为布尔值=False
Dim HPPROCESS As IntPtr=无
尝试
符号设置选项(2或4)
HPProcess=Process.GetCurrentProcess().Handle
如果(symminitialize(hProcess,Nothing,True)),则
已初始化=真
其他的
抛出新的Win32Exception(Marshal.GetLastWin32Error())
如果结束
Dim baseOfDll作为IntPtr=symloadmuleex(hProcess,IntPtr.Zero,(Environment.SystemDirectory&“\gdi32.dll”),Nothing,0,0,IntPtr.Zero,&H0I)
如果(baseofdl=IntPtr.Zero),则
抛出新的Win32Exception(Marshal.GetLastWin32Error())
如果结束
如果不是,则使用符号(
HProces,
巴塞尔,
"*",
函数(pSymInfo作为IntPtr,SymbolSize作为UInteger,UserContext作为IntPtr)
作为新符号的Dim结构\u信息
struct.SizeOfStruct=Marshal.SizeOf(GetType(SYMBOL\u INFO))
Marshal.PtrToStructure(pSymInfo,struct)
Debug.WriteLine(结构名)
返回真值
结束函数,IntPtr.Zero
)然后
抛出新的Win32Exception(Marshal.GetLastWin32Error())
如果结束
特例
Debug.WriteLine(例如Message)
最后
如果(已初始化),则
SymCleanup(hProcess)
如果结束
结束尝试
端接头
私有共享函数SymSetOptions(ByVal SymOptions为整数)为整数
端函数
私有共享函数SYMBINITALIZE(ByVal HPPROCESS作为IntPtr,ByVal UserSearchPath作为字符串,ByVal fInvadeProcess作为布尔值)作为布尔值
端函数
作为布尔值的专用共享函数symclup(ByVal hProcess作为IntPtr)
端函数
私有共享函数symloadmuleex(ByVal hProcess作为IntPtr,ByVal hFile作为IntPtr,ByVal ImageName作为String,ByVal ModuleName作为String,ByVal baseofdl作为Long,ByVal DllSize作为Integer,ByVal Data作为IntPtr,ByVal Flags作为Integer)作为ULong
端函数
私有共享函数SymEnumSymbols(ByVal hProcess作为IntPtr,ByVal baseofdl作为ULong,ByVal Mask作为String,ByVal EnumSymbolsCallback作为SymEnumSymbolsProc,ByVal UserContext作为IntPtr)作为Boolean'作为Boolean
端函数
私有委托函数SymEnumSymbolsProc(pSymInfo作为IntPtr,ByVal SymbolSize作为UInteger,ByVal UserContext作为IntPtr)作为布尔值
私有类符号\u信息
作为UInteger的公共规模结构
作为UInteger的公共类型索引
公共储备1为乌龙
作为乌龙的公共储备2
作为UInteger的公共索引
作为UInteger的公共规模
公共ModBase As ULong
作为UInteger的公共标志
乌龙的公共价值
乌龙广播
公开注册为UInteger
作为UInteger的公共范围
作为UInteger的公共标记
公共名称为UInteger
公共MaxNameLen作为UInteger
公共名称作为字符串
末级
末级

“只有两个保留字,而不是三个。”,是的,我后来注意到了这一点,因为我刚刚翻译了我在那里看到的原始C#代码,但是如果.NET索引以0开头,那么x[2]就不是x0,x1,x2了?在C++ C++中,索引是从1开始的,即使VB.NET代码“AR>(N-1)中的数组的实例化与C++ +代码> ARR(n)< /代码>不同,它们都是零基的。我已经测试了您的解决方案,并且我从C代码中得到了一个,看起来确实像预期的那样工作,一个使用符号来引用符号信息,而使用指针来表示。谢谢您的帮助。您能解释一下您的解决方案中的作用吗?:
SymSetOptions(SymOptionFlags.UNDNAME或SymOptionFlags.DEFERRED_load)
我已经阅读了MSDN文档,但我不清楚,您只需调用该方法一次,该方法应该返回一个“掩码”但是您没有缓存返回值以供以后使用,因此它确实会影响代码的其余部分,只需调用该方法一次?我不理解这一部分!“SymSetOptions”方法的使用真的是一种改进吗?
<DllImport("dbghelp.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
Public Shared Function SymInitialize(
       ByVal hProcess As IntPtr,
       ByVal UserSearchPath As String,
      <MarshalAs(UnmanagedType.Bool)> ByVal fInvadeProcess As Boolean
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function

<DllImport("dbghelp.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
Public Shared Function SymCleanup(
       ByVal hProcess As IntPtr
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function

<DllImport("dbghelp.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
Public Shared Function SymLoadModuleEx(
       ByVal hProcess As IntPtr,
       ByVal hFile As IntPtr,
       ByVal ImageName As String,
       ByVal ModuleName As String,
       ByVal BaseOfDll As Long,
       ByVal DllSize As Integer,
       ByVal Data As IntPtr,
       ByVal Flags As SymLoadModuleFlags
) As ULong
End Function

<DllImport("dbghelp.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
Public Shared Function SymEnumSymbols(
   ByVal hProcess As IntPtr,
   ByVal BaseOfDll As ULong,
   ByVal Mask As String,
   ByVal EnumSymbolsCallback As SymEnumSymbolsProc,
   ByVal UserContext As IntPtr
) As Boolean '  As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function

Public Delegate Function SymEnumSymbolsProc(
       ByRef pSymInfo As SYMBOL_INFO,
       ByVal SymbolSize As UInteger,
       ByVal UserContext As IntPtr
) As Boolean

<StructLayout(LayoutKind.Sequential)>
Public Structure SYMBOL_INFO

    Public SizeOfStruct As UInteger
    Public TypeIndex As UInteger
    Public Reserved1 As ULong
    Public Reserved2 As ULong
    Public Reserved3 As UInteger
    Public Size As UInteger
    Public ModBase As ULong
    Public Flags As SymFlag
    Public Value As ULong
    Public Address As ULong
    Public Register As UInteger
    Public Scope As UInteger
    Public Tag As SymTagEnum
    Public NameLen As Integer
    Public MaxNameLen As Integer
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=1024)>
    Public Name As String

End Structure

<FlagsAttribute>
Public Enum SymFlag As UInteger

    VALUEPRESENT = &H1
    REGISTER = &H8
    REGREL = &H10
    FRAMEREL = &H20
    PARAMETER = &H40
    LOCAL = &H80
    CONSTANT = &H100
    EXPORT = &H200
    FORWARDER = &H400
    [FUNCTION] = &H800
    VIRTUAL = &H1000
    THUNK = &H2000
    TLSREL = &H4000

End Enum

<FlagsAttribute>
Public Enum SymTagEnum As UInteger
    Null
    Exe
    Compiland
    CompilandDetails
    CompilandEnv
    [Function]
    Block
    Data
    Annotation
    Label
    PublicSymbol
    UDT
    [Enum]
    FunctionType
    PointerType
    ArrayType
    BaseType
    Typedef
    BaseClass
    [Friend]
    FunctionArgType
    FuncDebugStart
    FuncDebugEnd
    UsingNamespace
    VTableShape
    VTable
    [Custom]
    Thunk
    CustomType
    ManagedType
    Dimension
End Enum

<Description("Enum used as 'Flags' parameter of 'SymLoadModuleEx' function")>
<FlagsAttribute()>
Public Enum SymLoadModuleFlags As Integer

    Module_And_Symbols = &H0I
    Only_Module = &H4I
    Virtual = &H1I

End Enum

Public Shared Function EnumSyms(ByRef pSymInfo As SYMBOL_INFO,
                                ByVal SymbolSize As UInteger,
                                ByVal UserContext As IntPtr) As Boolean

    '  Debug.WriteLine(pSymInfo.Name)
    Debug.WriteLine(pSymInfo.Address & " " & SymbolSize & " " & pSymInfo.Name)
    Return True

End Function
Private Sub Test() Handles MyBase.Shown

    Dim hCurrentProcess As IntPtr = Process.GetCurrentProcess().Handle
    Dim baseOfDll As ULong
    Dim status As Boolean

    ' Initialize sym.
    ' Please read the remarks on MSDN for the hProcess
    ' parameter.
    status = SymInitialize(hCurrentProcess, Nothing, False)

    If status = False Then
        MsgBox("Failed to initialize sym.")
        Exit Sub
    End If

    ' Load dll.
    baseOfDll = SymLoadModuleEx(hCurrentProcess,
                                IntPtr.Zero,
                                "C:\Users\Administrador\Desktop\x64.dll",
                                Nothing,
                                0,
                                0,
                                IntPtr.Zero,
                                SymLoadModuleFlags.Module_And_Symbols)

    If baseOfDll = 0 Then
        MsgBox("Failed to load module.")
        SymCleanup(hCurrentProcess)
        Exit Sub
    End If

    ' Enumerate symbols. For every symbol the 
    ' callback method EnumSyms is called.
    If Not SymEnumSymbols(hCurrentProcess,
                          baseOfDll,
                          "*",
                          AddressOf EnumSyms,
                          IntPtr.Zero
    ) Then

        MsgBox("Failed to enum symbols.")

    End If

    ' Cleanup.
    SymCleanup(hCurrentProcess)

End Sub