2013-05-06 69 views
3

我可以成功編譯,但是當我去運行我的程序時,它會引發一個錯誤,告訴我一個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" 

有什麼辦法可以解決這個問題嗎?我可以提供哪些額外信息?

+1

我的第一個想法是重建所有,如果你還沒有。 – RichieHindle 2013-05-06 21:42:47

+1

@RichieHindle說什麼。這看起來像混合調試和非調試庫的結果。 – jdigital 2013-05-06 21:46:42

+0

我已經在release和debug配置中重建了所有的東西。我不確定你的意思是關於調試/非調試庫。 – 2013-05-07 11:07:02

回答

0

原來,在使程序與64位兼容的實驗中,CFileStatus結構中的m_size元素從AFX.H文件中的LONG更改爲ULONGLONG。這個問題在幾個版本中處於休眠狀態,但最後卻爆發了。不知道爲什麼。無論如何,我將聲明更改爲LONG,現在看起來工作正常。

+1

Woah ...等一秒鐘......你從** ULONGLONG'把**聲明「返回」改爲'LONG'? *請*告訴我你沒有編輯'afx.h'文件! – 2013-05-07 22:39:47

+0

'CFileStatus :: m_size'長期以來一直是'ULONGLONG'(至少從VS 2003開始)。這聽起來像你的程序可能鏈接到用VC6創建的庫,其中該字段有一個'LONG'類型(我不確定VS 2002中該字段的類型 - 我無法說服該程序安裝在我的Win7盒子上)。我認爲你需要對整個程序/產品中使用的庫進行一些分析。你當然不應該修補庫頭,不理解爲什麼他們似乎沒有在你的構建中工作。 – 2013-05-08 08:17:28

+0

我們仍在使用VS98(VC++ 6) – 2013-05-09 16:54:39