我正在使用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並更改回調函數時,我得到的文件名是正確的。
聽起來像是一個偏旁的問題。 Unicode字符串具有兩倍的字節數。你*真的*需要擺脫把Unicode字符串轉換爲(LPCSTR)的習慣,這是行不通的。大概你在別處做這件事,解釋這個問題。 –
嗨,漢斯,這確實是一個兩對一的問題,但它不是我的,它是MS的。如果我沒有定義DBGHELP_TRANSLATE_TCHAR,它告訴系統使用這些函數的ANSI版本(並用我的回調函數做一些調整),我可以得到完整的文件名,否則文件的名稱是不完整的。我在CodeProject上問了同樣的問題,一個名叫Richard的測試結果讓我相信(另外,我檢查他在我的電腦上做了什麼,結果與他所說的相同)。 – ericchan1336
再次感謝您耐心的回答。 – ericchan1336