DIA x64 & LocalFree

Я использую DIA Sdk для извлечения некоторой информации из файлов PDB. Я создаю некоммерческий объект DiaSourceAlt, поэтому я должен использовать LocalFree для освобождения строк.

Следующий фрагмент кода отлично работает в x86, но в x64 вызов LocalFree повреждает кучу.

IDiaSymbol *lpSymbol;
BSTR bStrName;

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

Любое предложение? (Я использую msdia90.dll)

С уважением, Мауро.

2 ответа

Решение

После некоторого реверс-инжиниринга я обнаружил, что один ДОЛЖЕН пройти "(LPBYTE)bstr - 4", потому что msdia##. Dll выделяет с помощью LocalAlloc и увеличивает указатель на четыре, прежде чем возвращать данные пользователю.

Я думаю, что это поведение для эмуляции BSTR, который хранит длину строки в DWORD непосредственно перед адресом, на который указывает указатель. Я обнаружил проблему, используя версию x64. В x86, несмотря на ту же проблему, приложение не аварийно завершает работу, а создает утечку.

С уважением.

Всегда будьте осторожны при работе с указателями. LocalAlloc увеличивает указатель на 4 байта. Размер BSTR - это слово, поэтому вы должны делать только "LocalFree(bstr - 2)".

Другие вопросы по тегам