2013-04-19 8 views
0

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

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

IDiaSymbol *lpSymbol; 
BSTR bStrName; 

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

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

С уважением, Mauro.

ответ

0

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

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

С уважением.

0

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