2013-07-23 95 views
0

我正在使用SymEnumSourceFiles來獲取調試模塊中的文件名。但是,作爲回調函數中的參數的文件名似乎不完整。例如名爲「c:\ program files \ test \ test.cpp」的文件僅在PSOURCEFILE類型參數的FileName部分中顯示「c:\ program fi」,並且非常有線。 這裏是我的代碼:SymEnumSourceFiles獲取不完整的文件名

struct foo 
{         
    static BOOL CALLBACK run(PSOURCEFILE pSourceFile, PVOID UserContext) 
    { 
     static TCHAR szFileName[MAX_PATH] = _T(""); 
     if (_tcscmp(szFileName, pSourceFile->FileName)) 
     { 
      _tcscpy(szFileName, pSourceFile->FileName); 
     } 
     return TRUE; 
    } 
}; 

    HANDLE hCurrentProcess = GetCurrentProcess(); 
    SymInitialize(hCurrentProcess, NULL, FALSE);  
    DWORD64 BaseOfDll = SymLoadModule64(hCurrentProcess, 
             NULL, 
             (LPCSTR)_bstr_t(lpszFile), 
             NULL,0,0); 
    if(!SymEnumSourceFiles(hCurrentProcess, BaseOfDll, NULL, foo::run, (PVOID)pCallBack)) 
    {  
     ATLTRACE(_T(__FUNCTION__) _T(" error:0x%x\n"), GetLastError()); 
    } 
    SymUnloadModule64(hCurrentProcess, BaseOfDll); 
    SymCleanup(hCurrentProcess); 

誰能告訴我哪裏出問題嗎? PS。當我用SymEnumLines替換SymEnumSourceFiles並更改回調函數時,我得到的文件名是正確的。

+0

聽起來像是一個偏旁的問題。 Unicode字符串具有兩倍的字節數。你*真的*需要擺脫把Unicode字符串轉換爲(LPCSTR)的習慣,這是行不通的。大概你在別處做這件事,解釋這個問題。 –

+0

嗨,漢斯,這確實是一個兩對一的問題,但它不是我的,它是MS的。如果我沒有定義DBGHELP_TRANSLATE_TCHAR,它告訴系統使用這些函數的ANSI版本(並用我的回調函數做一些調整),我可以得到完整的文件名,否則文件的名稱是不完整的。我在CodeProject上問了同樣的問題,一個名叫Richard的測試結果讓我相信(另外,我檢查他在我的電腦上做了什麼,結果與他所說的相同)。 – ericchan1336

+0

再次感謝您耐心的回答。 – ericchan1336

回答

0

曾經有一個SymEnumSymbols的錯誤,其中符號名稱不是零終止,也許這是相關的。嘗試複製文件後清零文件名(pSourceFile->FileName[0] = 0;)。

0

嘗試ANSI版本的SymEnumSourceFiles。 SymEnumSourceFilesW函數似乎有一個錯誤。