COM教程中的REGDB_E_CLASSNOTREG(Pluralsight)

时间:2016-04-29 17:52:36

标签: c++ com visual-studio-2015 regsvr32 midl

我试图教会自己COM的基本原则,为此我跟随肯尼克尔的“COM的基本要素”和#34;"关于Pluralsight的课程。我目前被困在" Remoting"第2部分,特别是标题为“#34;演示:定义远程接口"”的视频。我目前的完整解决方案列于此处:https://github.com/jakotheshadows/COMClient

我跑到

midl hen.idl

然后使用

编译输出
cl /W4 /DWIN32 /DREGISTER_PROXY_DLL *.c /link /DLL rpcrt4.lib /OUT:Proxy.dll /DEF:Exports.def

然后我做

regsvr32 Proxy.dll

它表示已成功注册。

但是当我在运行客户端时进入CoGetClassObject调用时:

#include "Precompiled.h"
#include "..\COMServer\Server.h"
#include "..\Proxy\Hen.h"

using namespace Microsoft::WRL;

int main()
{
    ComRuntime runtime(Apartment::SingleThreaded);

    ComPtr<IPSFactoryBuffer> proxyFactory;

    HR(CoGetClassObject(__uuidof(IAsyncHenEventHandler), 
                    CLSCTX_INPROC_SERVER,
                    nullptr,
                    __uuidof(proxyFactory), 
                    reinterpret_cast<void**>(proxyFactory.GetAddressOf())));

    ComPtr<IHen> hen;

    HR(CoCreateInstance(__uuidof(Hen), nullptr, CLSCTX_INPROC_SERVER, __uuidof(hen), reinterpret_cast<void**>(hen.GetAddressOf())));

    hen->Cluck();
}

我收到一个错误,我可以看到CoGetClassObject返回HRESULT REGDB_E_CLASSNOTREG,Kenny Kerr的例子似乎&#34;只是工作&#34;。

更新:有人建议rclsidriid参数在上面显示的调用中倒退。我试过了:

HR(CoGetClassObject(_uuidof(proxyFactory),
                    CLSCTX_INPROC_SERVER,
                    nullptr,
                    __uuidof(IAsyncHenEventHandler),
                    reinterpret_cast<void**>(proxyFactory.GetAddressOf())));

我仍然从CoGetClassObject遇到同样的HRESULT。

我不确定我在哪里出错了。我注意到当我使用依赖性walker检查Proxy.dll时,我看到了一些不同的东西,而不是Kerr先生得到的时候:

enter image description here

最值得注意的是,在我的Proxy.dll中有这样的&#34; ADVAPI32.DLL&#34;当Kenny Kerr用depends.exe检查Proxy.dll时不存在。此外,我看到他似乎没有得到的一些错误:

  
      
  1. 警告:至少找不到一个延迟加载依赖模块。
  2.   
  3. 警告:由于延迟加载相关模块中的导出功能缺失,至少有一个模块具有未解析的导入。
  4.   

我的环境和Kenny Kerr之间的另一个区别是我使用Visual Studio 2015,他正在使用Visual Studio 2012.我在Windows 7 Professional x64中运行。

0 个答案:

没有答案