<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    GetModuleHandle,AfxGetInstanceHandle使用區別

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接 當一個文件被映射到調用進程的地址空間時,GetModuleHandle函數得到其中某一模塊的句柄。  
    使用GetModuleHandle函數格式:
    HMODULE GetModuleHandle( LPCTSTR lpModuleName);  
      
    參數  lpModuleName:
        
    [in]用指針指向一個包含模塊名以NULL字符結尾的串,模塊是.dll或.exe文件。如果文件擴展名省略,則增加默認的擴展名.dll。文件名串可以是省略號(...),表示模塊名沒有擴展名。這個串不是必須指定一個路徑。當指定一個路徑時,確定要用反斜線(\),而不是斜線(/)。這個模塊名將和當前映射到調用進程地址空間的模塊名進行獨立地比較。    假如這個參數是NULL,函數將返回創建調用進程(.exe文件)的文件的句柄。 
     
    返回值:  
    如果函數調用成功,返回值是某一模塊的句柄。  如果函數調用失敗,返回NULL。要得知更多的出錯信息,調用GetLastError。 
     
    注釋:
    返回句柄不是全局的或可繼承的。它不能被其它進程復制或使用。  假如lpModuleName沒有包含路徑,而且有多個相同的文件名和擴展名,將不能預測返回哪一個模塊的句柄。要解決這個問題,需要指定路徑。用side-by-side assemblies指定,或用GetModuleHandleEx來指定一個內存區而不是一個DLL名。  GetModuleHandle函數對一個映像的模塊返回一個句柄,而不會增加引用(reference)數。然而,在傳遞這個句柄給FreeLibrary函數時,要當心,因為,這樣傳遞會導致一個DLL模塊過早地不能被映像。  這個函數在多線程程序中必須謹慎使用。不能保證這個模塊句柄在函數返回時和使用時是有效的。比如,一個線程得到模塊句柄,但在使用這個句柄之前,第二個線程釋放了這個模塊。假如這個系統載入另一個模塊,它可以再次使用最近釋放了的句柄。然而,第一個線程擁有一個模塊的句柄,這個模塊不同于先前那個模塊。     GetModuleHandle和AfxGetInstanceHandle和CWinApp->m_hInstance的區別 在工作中遇到一個問題,就是在一個DLL中想改變這個DLL的窗口的ICON,于是寫了如下的代碼:
        HICON    hicon=LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_ICON1));
      if (hicon!=NULL)
      {
          LRESULT  result=SendMessage(m_hWnd,WM_SETICON,ICON_SMALL,(LPARAM)hicon);   
      }    結果發現沒有成功,hicon=NULL,調試發現是LastError=1813,說是找不到指定的資源。 后面換成了這樣的代碼就可以了:
             HICON    hicon=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON1));
      if (hicon!=NULL)
      {
          LRESULT  result=SendMessage(m_hWnd,WM_SETICON,ICON_SMALL,(LPARAM)hicon);   
      } 換成下面這種也可以:
             HICON    hicon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
      if (hicon!=NULL)
      {
          LRESULT  result=SendMessage(m_hWnd,WM_SETICON,ICON_SMALL,(LPARAM)hicon);   
      }
                    百思不得其解,后面查MSDN和網絡,了解到是由于DLL的句柄跟Application的句柄混淆不清的原因,這里需要的是DLL的句柄。   1.GetModuleHandle(LPCTSTR lpModuleName)
       
      If this parameter is NULL, GetModuleHandle returns a handle to the file used to create the calling process (.exe file).
      如果參數為空,那么獲取的就是調用這個DLL 的exe的 句柄,也即application句柄,而不是DLL的句柄   如果要獲得當前DLL的句柄,要傳入DLL的名稱即可。 2.AfxGetInstanceHandle()
      
       An HINSTANCE to the current instance of the application. If called from within a DLL linked with the USRDLL version of MFC, an HINSTANCE to the DLL is returned.
       返回的是一個application的句柄,但是如果這個函數是從一個MFC的USRDLL版本DLL的內部被調用,那么返回的就是這個DLL的句柄 3.CWinApp->m_hInstance
       
      The m_hInstance data member is a handle to the current instance of the application running under Windows. This is returned by the global function AfxGetInstanceHandle. m_hInstance is a public variable of type HINSTANCE.
      因為它是從 AfxGetInstanceHandle()返回來獲得的,所以跟AfxGetInstanceHandle()的返回值一樣。RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全