代码(我在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。如果这是解决方案,我有两个问题:
答案 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
问题。