引自 dbgeng.h:
// 交易品种名称可能不是唯一的,尤其是
// 当重载函数存在时
// 具有相同的名称。如果 GetOffsetByName
// 为它的名字找到多个匹配项
// 可以返回其中任何一个。在那里面
// 如果它会返回 S_FALSE 来表示
// 这个歧义被任意解决了。
// 然后调用者可以使用 SearchSymbols 来
// 如果需要,查找所有匹配项
// 执行不同的消歧。
标准方法(GetOffsetByName)(
这_
__在 PCSTR 符号中,
__out PULONG64 偏移量
) 纯的;
所以,我会用 IDebugSymbols::GetNameByOffset() 获得名称(我相信它会像“module!name”一样返回),使用 IDebugSymbols::GetOffsetByName() 确保它是一个重载(如果你不确定)(它应该为多个重载返回 S_FALSE),并使用 StartSymbolMatch()/EndSymbolMatch() 查找具有此名称的所有可能性。虽然不是一个班轮(而且对这件事没有真正的帮助......)
另一种选择是与
结果
IDebugSymbols3::GetFunctionEntryByOffset(
在 ULONG64 偏移中,
在 ULONG 标志中,
OUT 可选的 PVOID 缓冲区,
在 ULONG BufferSize 中,
OUT OPTIONAL PULONG BufferNeeded
);
// 它可用于检索特定函数的 FPO 数据:
FPO_DATA fpo;
HRESULT hres=m_Symbols3->GetFunctionEntryByOffset(
addr, // 偏移量
0, // 标志
&fpo, // 缓冲区
sizeof(fpo), // 缓冲区大小
0 // 需要缓冲
));
然后使用 fpo.cdwParams 进行基本参数大小区分(cdwParams=参数大小)