我用GetModuleHandle得到一个dll的handle总是返回NULL, GetLastError()返回的是126,无法找到相应的模块。可是我的路径指定的是正确的呀。
我上网查了一下,有的说GetModuleHandle只能得到已经加载到当前进程的exe或者dll的handle,于是我用LoadLibrary加载进来,可是在debug otput窗口有这样的显示,貌似没有加载进来。
'UpdateTool.exe': Loaded 'C:\Program Files\myprof\gui.dll', No symbols loaded.
'UpdateTool.exe': Unloaded 'C:\Program Files\myprof\gui.dll'
如何才能正确使用GetModuleHandle
我上网查了一下,有的说GetModuleHandle只能得到已经加载到当前进程的exe或者dll的handle,于是我用LoadLibrary加载进来,可是在debug otput窗口有这样的显示,貌似没有加载进来。
'UpdateTool.exe': Loaded 'C:\Program Files\myprof\gui.dll', No symbols loaded.
'UpdateTool.exe': Unloaded 'C:\Program Files\myprof\gui.dll'
如何才能正确使用GetModuleHandle
'UpdateTool.exe': Unloaded 'C:\Program Files\myprof\gui.dll'
这是调试器输出的信息,不用管它。
一下是CModuleVersion中的代码,我 modulename中的路径应该没有问题BOOL CModuleVersion::GetFileVersionInfo(LPCTSTR modulename)
{
m_translation.charset = 1252; // default = ANSI code page
memset((VS_FIXEDFILEINFO*)this, 0, sizeof(VS_FIXEDFILEINFO));
//LoadLibrary(modulename);
DWORD error = GetLastError();
// get module handle
TCHAR filename[_MAX_PATH];
HMODULE hModule = ::GetModuleHandle(modulename);
error = GetLastError();
if (hModule==NULL && modulename!=NULL)
return FALSE; // get module file name
DWORD len = GetModuleFileName(hModule, filename,
sizeof(filename)/sizeof(filename[0]));
if (len <= 0)
return FALSE; // read file version info
DWORD dwDummyHandle; // will always be set to zero
len = GetFileVersionInfoSize(filename, &dwDummyHandle);
if (len <= 0)
return FALSE; m_pVersionInfo = new BYTE[len]; // allocate version info
if (!::GetFileVersionInfo(filename, 0, len, m_pVersionInfo))
return FALSE; LPVOID lpvi;
UINT iLen;
if (!VerQueryValue(m_pVersionInfo, _T("\\"), &lpvi, &iLen))
return FALSE; // copy fixed info to myself, which am derived from VS_FIXEDFILEINFO
*(VS_FIXEDFILEINFO*)this = *(VS_FIXEDFILEINFO*)lpvi; // Get translation info
if (VerQueryValue(m_pVersionInfo,
_T("\\VarFileInfo\\Translation"), &lpvi, &iLen) && iLen >= 4) {
m_translation = *(TRANSLATION*)lpvi;
TRACE("code page = %d\n", m_translation.charset);
} return dwSignature == VS_FFI_SIGNATURE;
}
'UpdateTool.exe': Loaded 'C:\Program Files\myprof\gui.dll', No symbols loaded.
'UpdateTool.exe': Unloaded 'C:\Program Files\myprof\gui.dll'
=====
我没有调用FreeLibrary(),可能是LoadLibrary()就没有成功吧
可以试试手动加载msvcrtd.dll,MFC42D.dll等.使用静态编译也可.
GetModuleHandle 是获取已经映射到你本进程内的那个模块的句柄
LoadLibrary是将一个模块映射到你调用该函数的进程内
作用不同
GetModuleHandle获得某个模块句柄是需要其它DLL支持的.一般失败是因为相关DLL未加载.而LoadLibraryEx是加载DLL函数.
'UpdateTool.exe': Loaded 'C:\Program Files\myprof\gui.dll', No symbols loaded.
已经出现,但没有出现
'UpdateTool.exe': Unloaded 'C:\Program Files\myprof\gui.dll'
才能成功。
而且我发现,当调用::LoadLibrary不成功时,IDE的output窗口也有“Loaded 'C:\WINDOWS\system32\lpk.dll', no matching symbolic information found.”等字样,所以,这个信息是不准确的。
所以,我想,LZ多半是调用::LoadLibrary不成功所致。楼主应该检查“HMODULE hModule = ::GetModuleHandle(modulename);”语句之前是否成功的调用了::LoadLibrary(modulename)!