OLE 控制項登錄失敗的可能原因

文章翻譯 文章翻譯
文章編號: 140346 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

OLE 控制項註冊藉由從 [工具] 功能表的從測試容器提供與該控制項開發套件 (CDK),使用 Visual C++ 或使用 Visual C++ 中提供 regsvr 或 regsvr32 應用程式。在某些情況下控制項的登錄可能會失敗 ; 請使用本文協助疑難排解問題。

其他相關資訊

所有註冊的 OLE 控制項先前所述的方法使用基本上是相同的技術。LoadLibrary() 稱為載入記憶體中的控制項、 GetProcAddress() 呼叫以取得 DllRegisterServer()] 函式的位址,然後 DllRegisterServer() 會呼叫來登錄此控制項。

為什麼登錄的控制項可能會失敗的原因

  • 一或多個必要 OLE DLL 不在路徑中。 您可以在 [Shipctrl.wri 中找到散發 OLE 控制項,以及解釋什麼 DLL 所需運送的指示位於 [CDK 相同的目錄中的檔案。
  • 控制項正在載入 OLE DLL,以外的 DLL,且該 DLL 不在路徑中。在控制項載入到記憶體時, 也載入隱含載入透過匯入程式庫的 DLL。 如果有任何這些 DLL 不是在路徑中,控制項並不會載入成功,所以登錄失敗。
  • 一或多個 DLL 可能是錯誤的版本。如果控制項以比電腦上安裝較新版本的 DLL 建置,控制項可能不會載入正確,所以登錄失敗。
  • 較舊版本的 Ocd25.lib 會被連結到。如果控制項使用 MFC 資料庫類別,可能是連結到 [Ocd25.lib 檔案的版本有問題。
  • OLE 控制項位於 Novell 伺服器的遠端磁碟機上。在這種情況下.ocx 檔的存取權限可能會不讓控制項載入。請確定.ocx 檔的存取權限設定為唯讀、 可共用存取,是典型的設定,可執行檔。

疑難排解技術

如果沒有任何可能的原因是在您的情況下,則為 True,請嘗試下列技術。

  1. 與控制項專案載入 Visual C++ 中,設定 [OLE 控制項測試容器 (Tstcon16.exe 或 Tstcon32.exe) 來偵錯工作階段可執行檔。您在啟動偵錯工具) 下測試容器時就會出現警告,測試容器不包含偵錯資訊。略過這並繼續進行。
  2. 從 [測試] 容器嘗試登錄該控制項。監看的 OLE 控制 DLL 或任何其相依的 DLL 的偵錯輸出。 如果您正在執行 16 位元產品,請記得執行 [DBWIN 程式接收偵錯輸出。

    有關如何設定 DLL 的可執行檔偵錯工作階段,請參閱線上叢書 》 中的 「 偵錯 DLL 」 的說明主題。
另一個方法,您可以嘗試以程式設計的方式登錄該控制項。首先建立 MFC AppWizard 應用程式選取 [對話方塊架構應用程式及 OLE 自動化。啟用 OLE 自動化將初始化 OLE,使程式碼來登錄此控制項將正常運作。 在 CWinApp 衍生] 類別中,您會找到該函數 InitInstance() 與初始程式碼,如下所示:
BOOL CTestregApp::InitInstance()
{

   // Initialize OLE libraries
   if (!AfxOleInit())
   {
      AfxMessageBox(IDP_OLE_INIT_FAILED);
      return FALSE;
   }
				
這個點在加入下列程式碼區段,可讓您檢查傳回碼從 LoadLibrary()、 GetProcAddress() 和 DllRegisterServer。
#ifdef _WIN32
    HINSTANCE hDLL = LoadLibrary("some.ocx");
    if(NULL == hDLL)
    {
        // See Winerror.h for explaination of error code.
        DWORD error = GetLastError();
        TRACE1("LoadLibrary() Failed with: %i\n", error);
        return FALSE;
    }

    typedef HRESULT (CALLBACK *HCRET)(void);
    HCRET lpfnDllRegisterServer;

    lpfnDllRegisterServer =
            (HCRET)GetProcAddress(hDLL, "DllRegisterServer");
    if(NULL == lpfnDllRegisterServer)
    {
        // See Winerror.h for explaination of error code.
        DWORD error = GetLastError();
        TRACE1("GetProcAddress() Failed with %i\n", error);
        return FALSE;
    }

    if(FAILED((*lpfnDllRegisterServer)()))
    {
        TRACE("DLLRegisterServer() Failed");
        return FALSE;
    }

#else // 16-bit
    HINSTANCE hDLL = LoadLibrary("regtest.ocx");
    if(HINSTANCE_ERROR > hDLL)
    {
        // See LoadLibrary() help for explaination of error code.
        TRACE1("LoadLibrary() Failed with: %i\n", hDLL);
        return FALSE;
    }

    typedef HRESULT (CALLBACK *HCRET)(void);
    HCRET lpfnDllRegisterServer;

    lpfnDllRegisterServer =
            (HCRET)GetProcAddress(hDLL, "DllRegisterServer");
    if(NULL == lpfnDllRegisterServer)
    {
        // See GetProcAddress() help for explaination of error code.
        TRACE("GetProcAddress() Failed");
        return FALSE;
    }

    if(FAILED((*lpfnDllRegisterServer)()))
    {
        TRACE("DLLRegisterServer() Failed");
        return FALSE;
    }
#endif
				

屬性

文章編號: 140346 - 上次校閱: 2003年12月1日 - 版次: 2.0
這篇文章中的資訊適用於:
  • Microsoft Visual C++ 1.5 Professional Edition
  • Microsoft Visual C++ 1.51
  • Microsoft Visual C++ 1.52 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 2.2
  • Microsoft Visual C++ 4.0 Standard Edition
關鍵字:?
kbmt kbcode kbctrl KB140346 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:140346
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com