新世纪想自己动手敲下〈COM技术内幕〉中的一些例子(其实是自己按照它的思路实现自己的想法)可真不容易啊。这不,实现一个COM跨进程通信的组件可把我郁闷坏了。实现什么功能都是得自己动手制作Makefile文件,汗。。。。都什么年代了,有多少人会这个啊(牛人除外)。到处都是集成开发环境IDE。这也难怪,〈COM技术内幕〉都绝版了。身边又没有一个会COM的,更别说高手了,诶。。还是那句话:一步一个脚印啊。。。。。高手应该都是这样产生的吧!呵呵。。看下文:
由于今天感觉很困,又挺晚的,在这里我就先介绍下怎么生成代理/存根dll,因为要进行跨进程通信,这个是前提撒。开发环境——Microsoft Visual Studio 2005
1.编译idl 文件,生成*_i.h、*_i.c、*_p.c、dlldata.c 四个文件。
*.h为接口说明头文件;
*_p.c为接口代理和存根的实现文件;
*_i.c为定义所有GUID描述符的文件;
dlldata.c包含代理/存根程序的入口函数及类厂所需的数据结构。
要是我写到这里就搁笔了,我想你肯定会拿砖头砸我,说了等于没说,什么编译idl文件啊,用VB或DELPHI,还是TC编吗?写个Makefile文件也一样可以编译啊。要讲就得说明白,对不。
在Microsoft Visual Studio 2005中创建Win32 console application空工程,注意是空的。然后添加一个新文件:add->NewItem,在出来的对话框中在code下新建一个midl file(.idl)文件,这样就够了。至于在.idl文件中写什么,这就不用我说了吧!
2。在Microsoft Visual Studio 2005中创建Win32 console application 空工程,类型为DLL。
3。新建一个.def文件(要是不知道怎么建,可以参考我前面的文章,里面有详细介绍)。格式如下:
LIBRARY "Proxy.dll"
EXPORTS
DllGetClassObject @1 PRIVATE
DllCanUnloadNow @2 PRIVATE
GetProxyDllInfo @3 PRIVATE//注意这个是用于跨进程通信的
DllRegisterServer @4 PRIVATE
DllUnregisterServer @5 PRIVATE
4。将第一步中生成的*_i.h、*_i.c、*_p.c、dlldata.c四个文件添加到工程中
5。设置工程编译属性:
1)在Preprocessor Definitions 中加入:REGISTER_PROXY_DLL
2)在Linker->Input->Module Definition file指定模块定义文件路径:*ps.def;
3)在 Linker->Input->Additional Dependencies中加入:rpcrt4.lib uiid.lib
6。好了,就OK了。剩下就编译了。
不过按照常理来说都会提示如如下错误:
fatal error C1189: #error : You need a Windows 2000 or later to run this stub because it uses these features:
别急,很简单就搞定的:只要在Preprocessor Definitions加入:_WIN32_WINNT=0x0500就OK了。可能有些人会问了Preprocessor Definitions是什么啊。呵呵!很正常。别急。它是个编译设置选项,在工程属性的C/C++下面,自己找找吧。
好了,去debug下面去找你的代理/存根dll吧。呵呵。最后提醒下,别忘了注册代理/存根dll哦,怎么注册,我在以前的文章中也提过,自己找找吧。累,该睡觉了,这只是实现跨进程通信的一下步,剩下的下次有时间再贴吧,明天还有课呢。。已经逃了好几节了,不能再跑了,要不挂了,哈哈。。。