通过ATL可以很轻松的建立dll(进程内组件) exe 和服务(进程外组件)
我想这个都很容易搞定。
在工程里插入COM简单对象也很容易,但是有个小毛病是
当建立dcom时需要一个生成一个proxy/stub的dll,这时就有点问题了。
我试过的步骤是,通过VC6的工程->输出制作文件在目录里就会产生
一个扩展名为.mk的makefile文件,这时可以通过手动,通过
cmd进入目录 然后 nmake -f <文件名>.mk就会产生proxy/stub dll文件了。
或者根据 VCHelp里张海涛的文章,在Project->Setting中Post-build step中写
入命令nmake -f <文件名>.mk, 写入后记得一定要输出mk文件,否则
目录里没有mk文件 Post-Build step的设置也就不会工作了。
配置好了有了proxy/stub后编译,然后注册生成的proxy/stub
regsvr32 <文件名>.dll
把生成的dcom也 注册为服务器 <文件名>.exe regserver
另外配置dcom的属性
运行里输入 dcomcnfg,然后找到要配置的dcom
然后查看其属性,设置标识为交互式用户即可。其他都保持默认,我的系统
是Windows XP Professional SP2
然后就可以创建客户端了,建立一个MFC的对话框
然后需要在stdafx.h中加入 #define _WIN32_DCOM,注意一定要加在
<afxwin.h>等头文件的前面
这样预处理器就会根据
此定义来选择性的引入DCOM需要的头文件
相应的CoCreateInstanceEx等函数也就会被支持。
接着需要 将 dcom服务器中的.h文件复制到根目录
然后要包含此文件
然后 将.c中的CLSID IID等复制到项目中。
然后
加入这么一小段代码,如果没有错误就已经连接到服务器了。
一般的错误是服务器的IP和访问权限设置的问题,另外就是在客户端
没有注册 Proxy/stub的中间代理com组件,实际上双方通信是通过此代理组件
进行的。
// TODO: Add extra initialization here
hr = CoInitialize(NULL);
if(FAILED(hr))
{
MessageBox("组件库加载失败");
return false;
}
hr = CoInitializeSecurity(
NULL, //Points to security descriptor
-1, //Count of entries in asAuthSvc
NULL, //Array of names to register
NULL, //Reserved for future use
RPC_C_AUTHN_LEVEL_DEFAULT, //The default authentication level for proxies
RPC_C_IMP_LEVEL_IDENTIFY, //The default impersonation level for proxies
NULL, //Reserved; must be set to NULL
0, //Additional client or server-side capabilities
NULL //Reserved for future use
);
/*通过CONSERVERINFO来配置服务器 billgates为服务器名或IP地址*/
COSERVERINFO ServerInfo = {0,L"billgates",NULL,0};
MULTI_QI Multi_qi = {&IID_IUnknown,NULL,NOERROR};
hr = CoCreateInstanceEx(CLSID_IDcom,NULL,CLSCTX_REMOTE_SERVER,&ServerInfo,1,&Multi_qi);
if(FAILED(hr))
{
MessageBox("创建实例失败.");
return false;
}
pUnknown = (IUnknown*)Multi_qi.pItf;
hr = pUnknown->QueryInterface(IID_IIDcom,(void**)&dcom);
pUnknown->Release();
接着你可以使用
查讯的dcom接口也就是IID_IIDcom接口来调用接口了。
实际上的接口根据你创建的项目名和插入的组件名不同而不同。
IID_IIDcom是我插入的简单对象组件。
COM的书
《COM技术内幕》
《COM/DCOM编程指南》
《COM原理与应用》
三本书后你会发现虽然COM中文的书挺少,但内容的难度绝对不比C++的书差。而且你会发现书会越看越多,最后连初衷多乱了。所以还是尽量参考好,把初中完整的完成是最好了,一些高手也许就是专注 大量练习 和可以过滤掉节外生枝的东西吧,当然他们的理解能力和逻辑能力稍稍有点高于常人,但是不论什么高人也都是建立在正确的学习方法和吃苦耐劳上的。
其高明和熟练的技能往往只是一瞬而已,过了这一瞬立刻会发现自己的不足并迎头干上,这也就是为什么计算机技术发展如此之快的原因吧。