Почему IDiaDataSource::loadDataForExe завершается ошибкой с E_PDB_NOT_FOUND из IDE, но не снаружи?
Я начинаю с DIA SDK и имею следующий простой код:
#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? Я ничего не вижу в документации.
1 ответ
Возможно, вы можете проверить текущую разность каталогов между IDE и вашим внешним прогоном, потому что loadDataForExe по умолчанию будет искать файл pdb в текущем каталоге.