您目前已離線,請等候您的網際網路重新連線

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

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本: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				
kbinf 1.51 1.52 1.52b 2.00 2.10 2.20 2.50 2.51 2.52 3.00 3.10 3.20 4.00

警告:本文為自動翻譯

內容

文章識別碼:140346 - 最後檢閱時間:12/04/2015 12:29:33 - 修訂: 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

  • kbnosurvey kbarchive kbmt kbcode kbctrl KB140346 KbMtzh
意見反應