CoCreateInstance异常。在静态库上使用REGSVR32进行类注册?

时间:2016-03-29 18:17:38

标签: c# c++ visual-studio com static-libraries

代码(我在c#app中为Win32平台构建的c ++ com服务器项目的片段):

CComPtr<IMSPRProvider> test;
hr = CoCreateInstance(CLSID_MSPRProvider, NULL, CLSCTX_ALL, IID_IMSPRProvider, reinterpret_cast<void**>(&test));

HR:regdb_e_classnotreg。班级未注册

在同一个项目中,我有一个较旧的WMDRM drm实现,可以正常使用cocreateinstance调用。所以这个问题特别适用于新的游戏类。

我看到有关此异常的其他问题建议使用regsvr32.exe注册dll。如果这是解决方案,我有两个问题:

  1. 我从来不需要注册任何其他东西(比如WMDRM的东西),为什么会这样?
  2. 我正在使用PlayReady SDK,它包含我已链接到项目中的一些.h,.idl和.lib文件。我没有动态库。什么是静态库的等效解决方案?
  3. PS:我对c ++几乎没有经验。我非常认真地对待所有这些,所以如果我没有给出足够的细节,我会道歉。

1 个答案:

答案 0 :(得分:2)

CoCreateInstance使用服务器创建一个实例,该实例需要以某种方式提供。在大多数情况下,服务器是一个DLL,它需要首先在regsvr32中注册,以便有问题的CLSID写在全局列表中,API知道如何查找实现。

  

我从来不需要注册任何其他东西(比如WMDRM的东西),为什么会这样?

REGDB_E_CLASSNOTREG表示服务器未注册,因此您需要执行此操作。如果你之前从未这样做过,那么你可以通过别的方式为你完成它。

  

我正在使用PlayReady SDK,它包含我已链接到项目中的一些.h,.idl和.lib文件。我没有动态库。静态库的等效解决方案是什么?

静态库没有等价物。 CoCreateInstance使用标准API创建实例。如果将实现链接在一起,你根本就不需要静态库。但是,最有可能的是你的静态库&#34;只是一个前端和/或声明,真正的实现是在动态加载库中。因此CoCreateInstance和注册。

另一件需要注意的事情是32/64位混淆。您的代码应该匹配DLL的位数。如果不匹配,您可能会再次遇到REGDB_E_CLASSNOTREG问题。