2015-02-13 19 views
0

я начало работы с 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? Я ничего не вижу в документации.

ответ

0

Возможно, вы можете проверить текущую разницу в каталоге между IDE и внешним запуском, поскольку loadDataForExe по умолчанию будет искать файл pdb в текущем каталоге.

+0

Эта проблема также связана с symsrv.dll, и вы можете попробовать скопировать файл нужной версии в каталог времени исполнения. – oppo