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)".