我可以成功編譯,但是當我去運行我的程序時,它會引發一個錯誤,告訴我一個DLL不存在。經過反覆試驗,我確定該程序正在尋找「ROGRAM FILES \ FolderName \ rrpd.dll」中的DLL,顯然會切斷文件夾的前四個字符。賦值語句刪除字符
這是一個名爲R & R Report Writer的應用程序,它已經存在了25年以上,從未遇到過這個問題。
調試,我確定錯誤來自於程序模塊EXPLMGR.CPP賦值語句(顯式庫管理器):
CString CExplicitLibraryManager::FindLocalDllFile(CString csDllName) const
{
ASSERT(csDllName.Find('\\') == -1); // These names should not have directory stuff.
// Search for the file in the program directory directory.
// If not found there, search in the registry system.
// If not found in either location, just return the file name.
CString csDllPath = m_csAppDirectory + csDllName ;
BOOL bDllExists = DoesFileExist (csDllPath) ; // Don't bother calling DoesDllExist(). A path is provided.
if (!bDllExists)
{
csDllPath = m_csRrSystemDirectory + csDllName ;
bDllExists = DoesFileExist (csDllPath) ;
if (!bDllExists)
{
// Must call the FindWindowsFile() here so that we can guarentee to return the full pathname.
csDllPath = FindWindowsFile (csDllName) ;
bDllExists = DoesFileExist (csDllPath) ;
}
}
if (bDllExists)
{
CFileStatus fsFile ;
CFile::GetStatus (csDllPath, fsFile) ;
//TRACE("CExplicitLibraryManager::FindLocalDllFile() Reports the DLL to be %s\n", fsFile.m_szFullName) ;
csDllPath = fsFile.m_szFullName ;
}
return csDllPath ;
}
具體而言,4號線向上從底部:
csDllPath = fsFile.m_szFullName ;
此時,fsFile.m_szFullName是「C:\ PROGRAM FILES \ FolderName \ rrpd.dll」,csDllPath也是一樣的。
調試和點擊[F11],分配潛水右轉入
c:\program files\Microsoft visual studio\vc98\mfc\src\strcore.cpp
和部分是:
const CString& CString::operator=(LPCTSTR lpsz)
{
ASSERT(lpsz == NULL || AfxIsValidString(lpsz));
AssignCopy(SafeStrlen(lpsz), lpsz);
return *this;
}
立刻,如果我鼠標移到lpsz,它的價值現在是
"rogram files\FolderName\rrpd.dll"
有什麼辦法可以解決這個問題嗎?我可以提供哪些額外信息?
我的第一個想法是重建所有,如果你還沒有。 – RichieHindle 2013-05-06 21:42:47
@RichieHindle說什麼。這看起來像混合調試和非調試庫的結果。 – jdigital 2013-05-06 21:46:42
我已經在release和debug配置中重建了所有的東西。我不確定你的意思是關於調試/非調試庫。 – 2013-05-07 11:07:02