';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