я начало работы с DIA SDK и имею следующий простой код:Почему IDiaDataSource :: loadDataForExe терпит неудачу с E_PDB_NOT_FOUND из IDE, но не извне?
#define PRINTIFHRIS(x) if (hr == x) printf(#x "\n");
int main()
{
HRESULT hr;
IDiaDataSource *ds = NULL;
wchar_t cwd[300];
GetCurrentDirectory(300, cwd);
printf("CWD: %S\n", cwd);
hr = CoInitialize(NULL);
assert(SUCCEEDED(hr));
hr = CoCreateInstance(
CLSID_DiaSource,
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IDiaDataSource),
(void**)&ds
);
assert(SUCCEEDED(hr));
hr = ds->loadDataForExe(L"readpdb.exe", NULL, NULL);
PRINTIFHRIS(E_PDB_NOT_FOUND);
PRINTIFHRIS(E_PDB_FORMAT);
PRINTIFHRIS(E_PDB_INVALID_SIG);
PRINTIFHRIS(E_PDB_INVALID_AGE);
PRINTIFHRIS(E_INVALIDARG);
PRINTIFHRIS(E_UNEXPECTED);
PRINTIFHRIS(S_OK);
assert(SUCCEEDED(hr));
return 0;
}
Если я начну это из Visual Studio IDE, то утверждать, терпит неудачу с E_PDB_NOT_FOUND, даже если я начинаю его без отладки. Но если я запускаю ту же самую программу за пределами IDE, она отлично работает и возвращает S_OK. Сначала я подумал, что это проблема с рабочим каталогом, поэтому я сначала поставил printf, чтобы понять, не проблема ли это, но это не проблема. Рабочий каталог тот же, и PDB есть.
Выполняет ли Visual Studio что-то, что влияет на поведение DIA SDK? Я ничего не вижу в документации.
Эта проблема также связана с symsrv.dll, и вы можете попробовать скопировать файл нужной версии в каталог времени исполнения. – oppo