我可以成功编译,但是当我去运行我的程序时,它会抛出一个错误,告诉我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"
有没有办法解决这个问题?我可以提供哪些其他信息?
答案 0 :(得分:0)
事实证明,在尝试使程序与64位兼容时,CFileStatus结构中的m_size元素从AFX.H文件中的LONG更改为ULONGLONG。这个问题在几个版本中处于休眠状态,但最终爆发了最新版本。不知道为什么。无论如何,我把声明改回LONG,现在似乎正常工作。