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

文章翻译 文章翻译
文章编号: 140346 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

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
				

属性

文章编号: 140346 - 最后修改: 2004年1月19日 - 修订: 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
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
不再更新的 KB 内容免责声明
本文介绍那些 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