我用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

解决方案 »

  1.   

    'UpdateTool.exe': Loaded 'C:\Program Files\myprof\gui.dll', No symbols loaded. 
    'UpdateTool.exe': Unloaded 'C:\Program Files\myprof\gui.dll' 
    这是调试器输出的信息,不用管它。
      

  2.   

    我用的是开源的类CModuleVersion按理说不会有什么问题吧
    一下是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;
    }
      

  3.   

    关键是你得modulename到底等于多少至于你得调试输出,第二个表示你已经调用过FreeLibrary?
    'UpdateTool.exe': Loaded 'C:\Program Files\myprof\gui.dll', No symbols loaded. 
    'UpdateTool.exe': Unloaded 'C:\Program Files\myprof\gui.dll' 
      

  4.   

    当然,只有你得模块载入在进程内才行,也就是上面得调试语句第一句必须在output窗口出现,第二句必须不在output窗口出现才行。而你得modulename必须是'gui', 'gui.dll'或者'C:\Program Files\myprof\gui.dll',必须用\\而不能用/
      

  5.   

    记得用tlist 工具枚举一下你得模块,看看到底在不在里面
      

  6.   

    返回的hModule为0是吗?modulename的内容是什么?
      

  7.   

    返回的hMoudule是0,modulename的内容是“C:\Program Files\myprof\gui.dll” 而且是unicode类型的
      

  8.   

    回复6楼
    =====
    我没有调用FreeLibrary(),可能是LoadLibrary()就没有成功吧
      

  9.   

    的确使用GetModuleHandle时要加载相应DLL.你这样的情况很可能是相关DLL未加载.使用LoadLibraryEx加载相关DLL并加以判断.
    可以试试手动加载msvcrtd.dll,MFC42D.dll等.使用静态编译也可.
      

  10.   

    两个函数的功能不一样不能相提并论
    GetModuleHandle 是获取已经映射到你本进程内的那个模块的句柄
    LoadLibrary是将一个模块映射到你调用该函数的进程内
    作用不同
      

  11.   

    要相提并论.作用不同就不能并论?
    GetModuleHandle获得某个模块句柄是需要其它DLL支持的.一般失败是因为相关DLL未加载.而LoadLibraryEx是加载DLL函数.
      

  12.   

    在执行到GetModuleHandle时,必须是
    'UpdateTool.exe': Loaded 'C:\Program Files\myprof\gui.dll', No symbols loaded.
    已经出现,但没有出现
    'UpdateTool.exe': Unloaded 'C:\Program Files\myprof\gui.dll'
    才能成功。
      

  13.   

    我在我的机器上调试了一下。发现当::LoadLibrary调用不成功时,即返回的handle是NULL时,则调用GetModuleHandle返回也是NULL。
    而且我发现,当调用::LoadLibrary不成功时,IDE的output窗口也有“Loaded 'C:\WINDOWS\system32\lpk.dll', no matching symbolic information found.”等字样,所以,这个信息是不准确的。
    所以,我想,LZ多半是调用::LoadLibrary不成功所致。楼主应该检查“HMODULE hModule = ::GetModuleHandle(modulename);”语句之前是否成功的调用了::LoadLibrary(modulename)!
      

  14.   

    是路径问题 因为 programfiles 中带有空格导致了这个原因,将dll放在 不带有空格的路径下即可解决