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,請嘗試下列技術。
- 與控制項專案載入 Visual C++ 中,設定 [OLE 控制項測試容器 (Tstcon16.exe 或 Tstcon32.exe) 來偵錯工作階段可執行檔。您在啟動偵錯工具) 下測試容器時就會出現警告,測試容器不包含偵錯資訊。略過這並繼續進行。
- 從 [測試] 容器嘗試登錄該控制項。監看的 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