0

我正在使用 DIA Sdk 从 PDB 文件中提取一些信息。我创建了非 com DiaSourceAlt 对象,因此我必须使用 LocalFree 来释放字符串。

以下代码在 x86 中运行良好,但在 x64 中,LocalFree 调用破坏了堆。

IDiaSymbol *lpSymbol;
BSTR bStrName;

...
hRes = lpSymbol->get_undecoratedNameEx(0x87FE, &bStrName);
if (SUCCEDED(hRes))
  LocalFree(bStrName);

有什么建议吗?(我正在使用 msdia90.dll)

问候,毛罗。

4

2 回答 2

0

在做了一些逆向工程之后,我发现必须传递“(LPBYTE)bstr - 4”,因为 msdia##.dll 使用 LocalAlloc 进行分配,并在将数据返回给用户之前将指针递增 4。

我认为这种行为是为了模拟 BSTR,它将字符串的长度存储在 DWORD 中,就在指针指向的地址之前。我使用 x64 版本发现了这个问题。在 x86 中虽然有同样的问题,但应用程序不会崩溃但会产生泄漏。

问候。

于 2013-04-20T12:47:47.183 回答
0

使用指针时请务必小心。LocalAlloc 将指针增加 4 个字节。BSTR 大小是单词,因此您只能执行“LocalFree(bstr - 2)”。

于 2016-04-25T15:31:56.607 回答