我试图教会自己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;。
更新:有人建议rclsid
和riid
参数在上面显示的调用中倒退。我试过了:
HR(CoGetClassObject(_uuidof(proxyFactory),
CLSCTX_INPROC_SERVER,
nullptr,
__uuidof(IAsyncHenEventHandler),
reinterpret_cast<void**>(proxyFactory.GetAddressOf())));
我仍然从CoGetClassObject遇到同样的HRESULT。
我不确定我在哪里出错了。我注意到当我使用依赖性walker检查Proxy.dll时,我看到了一些不同的东西,而不是Kerr先生得到的时候:
最值得注意的是,在我的Proxy.dll中有这样的&#34; ADVAPI32.DLL&#34;当Kenny Kerr用depends.exe检查Proxy.dll时不存在。此外,我看到他似乎没有得到的一些错误:
- 警告:至少找不到一个延迟加载依赖模块。
- 警告:由于延迟加载相关模块中的导出功能缺失,至少有一个模块具有未解析的导入。
醇>
我的环境和Kenny Kerr之间的另一个区别是我使用Visual Studio 2015,他正在使用Visual Studio 2012.我在Windows 7 Professional x64中运行。