逸逸记事
逸逸记事

我的分类(专题)

首页(175)
儿子(9)
SIP技术(9)
Web2.0(12)
摄影和DVD(8)
软件开发随笔(18)
名古屋打工生活(11)
微软技术开发(47)
Java技术(12)
加拿大移民生活(20)
生活点滴(6)
第一份工作--上海贝尔(18)
完成项目(13)
回国后的生活(0)


最新日志
独行者
终于知道什么叫外包了
人生悲哀之事
水晶报表中显示动态图片
水晶报表中的简单参数设置
怀念下小黑
dotnet中的数据连接Timeout
老板的思路
又买房了
交通事故

最新回复
回复:独行者
回复:怀念下小黑
回复:老板的思路
回复:mjSip学习笔记
回复:老板的思路
回复:dotnet中的数据连接Timeo
回复:mjSip学习笔记
回复:交通事故
回复:交通事故
回复:又买房了

留言板

签写新留言

您好,很希望问您一个关于jain-sip
生活经历就是最大的财富,羡哦~
java的Web开发问题
回复:疑问
IT还不如妓女呢,呵呵
myjavaserver的空间
求助
您的子域名已开通

统计
blog名称:人在旅途
日志总数:175
评论数量:505
留言数量:13
访问次数:1674495
建立时间:2005年12月7日

链接

 

生命是过客,人在旅途。奶奶是信基督教的,没啥文化,却养育了四子二女,还带过九个孙辈。老人家对生命的看法就是“人都是客人,迟早要回去的。”就以《人在旅途》来纪念她。

 

«October 2025»
1234
567891011
12131415161718
19202122232425
262728293031

公告
  本人上传的源程序中可能引用或使用了第三方的库或程序,也可能是修改了第三方的例程甚至是源程序.所以本人上传的源程序禁止在以单纯学习为目的的任何以外场合使用,不然如果引起任何版权问题,本人不负任何责任.




     本站首页    管理页面    写新日志    退出
调整中...
[微软技术开发]ATL:Implement the same default interface from different object in different DLLs(different project) and using user define type in the interface method.
人在旅途 发表于 2006/1/22 8:24:21

First Way:1. As normally, first create the ATL object(Eg: First) and an ATL interface(Eg: IFirst) in a DLL by the ATL Wizard in the first project.2. Add IFirst's method by using ATL Class Wizard.3. Create a IDL file(For example, FirstInterface.idl), then move the definition of IFirst to that IDL file. Don't forget to move the necessary "#import" directive and necessary enum, structure definition to that IDL file.4. Now you can remove the IFirst's definition from it's original place and replace with " import "FirstInterface.idl" ". Then you need to add the FirstInterface.idl to your project file group. Now build it, it is ok.5. Thus, you have a file named FirstInterface.idl containing your interface definition. So you can add this IDL file to any project you want to use this interface with following steps: A. Add it to project file group; B. Add  " #include  "FirstInterface.idl"; "  to the project's IDL file; C. Add " interface IFirst " to you coclass definition of the project's IDL file; D. Public your C++ implement class from IFirst. E. Implement in your C++ implement class of these virtual definition methods of IFirst.(The easiest way I think is to copy the source code from you first project and modify it)6. Now everything is ok. What? you want to modify the IFirst(maybe adding some more methods). Yes, you can do it, but it is not encouraged for you to do this. You are advised to make everything ok for the IFirst in your first project. If you really want to change it later, you can change it in your first project(still with the ATL class wizard) and then change the implemention of that IFirst in every other projects. It is really silly, but isn't Microsoft more silly. Second Way:1. Right click your implement  C++ class, then select "Implement Interface",then click "Add Typelib", then add the DLL contain that interface.Notes: You can't modify the interface by this ways. Sometimes you may want to use use define type or some not standard OLE type in your interface definition. Yes, you can do it like that, but first be sure of two things:1. Your object is in a DLL in in a EXE.2. Your interface is not a dual interface which support IDispatch, but only a custom interface. Now here is a sample:1. I want to use ITEMIDLIST in the interface definition, so I add it to my definition. But an error raised when compiling that the ITEMIDLIST  has no definition.2. So I add "#include shlobj.h" to that IDL file, but still get error when compiling.3. So I remove the "#include shlobj.h", and copying the definition of ITEMIDLIST  from the "shlobj.h". But because I already have include the "shlobj.h" in the "stdafx.h". So there are some definition is re-defined. So I got  a problem:If I don't copy the definition of ITEMIDLIST to the IDL file, I can't use ITEMIDLIST in the interface definition.If I copy it, then the ITEMIDLIST definition will be generated in the head file created by IDL compilor according to the IDL file. And that head file will need to be included in your project file. But the definition has already defined in the "shlobj.h" which also need to be included in your porject file. So there is a redefinition problem.4.I solve the problem like this:In the IDL file, I using: cpp_quote("#if 1>5") // SHITEMID -- Item ID typedef struct _SHITEMID        // mkid {  USHORT      cb;             // Size of the ID (including cb itself)  BYTE        abID[1];        // The item ID (variable length) } SHITEMID; // ITEMIDLIST -- List if item IDs (combined with 0-terminator) typedef struct _ITEMIDLIST      // idl {  SHITEMID    mkid; } ITEMIDLIST; cpp_quote("#endif")The cpp_quote("xxx") will merge the string directly to the created head file, and it has no effect in the IDL file.The cpp_quote("#if 1>5") and cpp_quote("#endif") will make an effect in the created IDL file that the definition between them will never be compiled by the condition compiling directive(because "if 1>5" always false).Thus I solve this problem. But there are still two things need to care:1. Be sure, you already include "shlobj.h" before include the created head file by IDL compilor.2. When this interface is implemented in two different object like Ob1 and Ob2. And you need to use both the objects in the some project. Then after you have imported both of them, you will get three definition of ITEMIDLIST: A. the Ob1::ITEMIDLIST; B. the Ob2::ITEMIDLIST; C. the definition in the "shlobj.h".So you need to convert them from time to time, eg:  (Ob1::ITEMIDLIST)....

阅读全文(2708) | 回复(0) | 编辑 | 精华


发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.559 second(s), page refreshed 144816345 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号