你目前正处于脱机状态,正在等待 Internet 重新连接

OLE 控件注册失败的可能原因

不再更新的 KB 内容免责声明
本文介绍那些 Microsoft 不再提供支持的产品。因此本文按“原样”提供,并且不再更新。
概要
OLE 控件可以通过以下方法注册:使用 Visual C++ 的“工具”菜单、使用控件开发工具箱 (CDK) 随附的测试容器或使用 Visual C++ 随附的 regsvr 或 regsvr32 应用程序。有些情况下,控件的注册可能失败;请使用本文帮助解决这一问题。
更多信息
前面提到的所有注册 OLE 控件的方法本质上使用的是同一技术。调用 LoadLibrary() 以将控件加载到内存中,调用 GetProcAddress() 以获取 DllRegisterServer() 函数的地址,然后调用 DllRegisterServer() 以注册控件。

控件注册失败的原因

  • 一个或多个必需的 OLE DLL 不在路径中。有关分发 OLE 控件的说明以及必须发行哪些 DLL 的说明,请参见 Shipctrl.wri 文件,该文件与 CDK 位于同一目录中。
  • 控件加载的是 DLL 而不是 OLE DLL,而该 DLL 不在路径中。将控件加载到内存中时,同时还将加载任何通过导入库隐式加载的 DLL。如果这些 DLL 中的任何一个不在路径中,控件将不会成功加载,因此注册会失败。
  • 一个或多个 DLL 的版本不正确。如果建立控件所使用的 DLL 的版本比计算机上安装的版本新,则控件可能无法正确加载,因此注册会失败。
  • 链接到了旧版本的 Ocd25.lib。如果控件使用的是 MFC 数据库类,则链接到的 Ocd25.lib 文件的版本可能有问题。
  • OLE 控件位于 Novell 服务器的远程驱动器中。这种情况下,对 .ocx 文件的访问权限可能会阻止控件加载。确保对 .ocx 文件的访问权限被设置为只读、可共享的访问权限,这是可执行文件的典型设置。

疑难解答技术

如果这些可能的原因都不符合您的情况,请尝试以下技术。

  1. 使用 Visual C++ 中加载的控件项目,将调试会话的可执行文件设置为 OLE 控件测试容器(Tstcon16.exe 或 Tstcon32.exe)。当您启动测试容器(在调试器下)时,将出现一条警告信息,指示该测试容器不包含调试信息。忽略此警告并继续。
  2. 从测试容器中尝试注册控件。观察 OLE 控件 DLL 或它的任何依赖 DLL 的调试输出。如果您运行的是 16 位产品,请记住运行 DBWIN 程序以接收调试输出。

    有关如何为 DLL 调试会话设置可执行文件的信息,请参阅《联机图书》中的帮助主题“Debugging DLLs”(调试 DLL)。
或者,您还可以尝试以编程方式注册控件。首先,通过选择“基于对话框的应用程序”和“OLE 自动化”来创建 MFC AppWizard 应用程序。启用“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
属性

文章 ID:140346 - 上次审阅时间:01/19/2004 21:08:34 - 修订版本: 2.0

  • Microsoft Visual C++ 1.5 专业版
  • Microsoft Visual C++ 1.51
  • Microsoft Visual C++ 1.52 专业版
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 2.2
  • Microsoft Visual C++ 4.0 标准版
  • kbcode kbctrl KB140346
反馈