Почему 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 в текущем каталоге.

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