C和C#之间互相调用经验详谈.doc

C和C#之间互相调用经验详谈.doc

ID:62033172

大小:26.00 KB

页数:8页

时间:2021-04-15

C和C#之间互相调用经验详谈.doc_第1页
C和C#之间互相调用经验详谈.doc_第2页
C和C#之间互相调用经验详谈.doc_第3页
C和C#之间互相调用经验详谈.doc_第4页
C和C#之间互相调用经验详谈.doc_第5页
资源描述:

《C和C#之间互相调用经验详谈.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C++和C#之间互相调用经验详谈先说说程序大概组织逻辑。主程序有一套公用接口(其实就是纯虚类),在加载DLL时候将此接口传到DLL中,这样子模块在需要的时候就可以调用父的逻辑了,至于父调子,那就更简单了,主程序有一个纯虚类,子模块都继承此接口,并进行重写,主程序按照一定的顺序分别调用,这样父与子的逻辑交互就完成了,这些对都是C++程序来说,这当然没问题。现在问题是,要嵌入.NET的类库,由此引发一系列问题……  软件是以C++为父,DLL作为子的项目。开发环境:WIN764BIT+VS2010+M

2、FC+ATL+COM.。NET环境下先以C#为例,其他的大部分一样下,不排除做一些简单或者复杂的修改.  下面正式开始把。  1。动态加载 即父调子。 COM确实是好东西(他的褒与贬我们无作评论),她的语言无关性,不仅是我们实现动态加载的关键,更是实现加载其他。NET类库的核心.如VB。NET.有了她,才是这一切皆有可能.由于。NET下的类库(DLL),和传统的WINDLL不太一样,毕竟托管的东西。她一些函数对外是不可见的,但对COM可见。因为我们就以COM方式定义一套接口,并把此接口当成普通C+

3、+的纯虚接口,来完成父到子的调用.这一点不论在理论上、代码上都比较简单,而且网上大多也是这样子,所以我们直接上代码。 如下为COM接口定义.[ComVisible(true),Guid("B86D71F4—FE07-4B60-8246-F5AE283ED2A3"),  InterfaceType(ComInterfaceType.InterfaceIsDual)  ] publicinterfaceIHMI {[PreserveSig,DispId(1)] voidOnCreate(inta);[

4、PreserveSig,DispId(2)]voidSetRect(int left,inttop, int width,intheight);  //其他接类似 }  [ComVisible(true),  ClassInterface(ClassInterfaceType.AutoDual),ProgId("xxxxxxx.xxxxxxx”)//ProgId主程序根据此,运行时动态创建。  ]  C#在使用时要继承并实现接口逻辑,如下类似。publicclassCustomCOMClient 

5、:IHMI{publicCustomCOMClient()  { }  [DispId(1)] publicvoid OnCreate(inta)  {  //逻辑 }  [DispId(2)]  public voidSetRect(intleft,inttop, intwidth,intheight) {  //逻辑 } }  当然了,在建项目时,项目类型要为类库。至此类库部分已经完毕。接下来再看看主程序如何加载,以及如何调用把。 其中在动态创建时,ProgId是关键。这一部分对搞过COM,在

6、加上ATL的人来说,可能太简单了,’可能'这个词也许用的不太恰当,因为她不是'可能’,她确实简单。不信看代码.  ::CoInitialize(NULL); const OLECHAR lpszProgID[]=OLESTR(”xxxxxxx。xxxxxxx”);//ProgID CComPtr m_NetCustomer; HRESULT hr=m_NetCustomer.CoCreateInstance(lpszProgID); if(SUCCEEDED(hr)){ constLPCOLEST

7、R szMember=OLESTR(”OnCreate"); VARIANTv; v.vt= VT_I4;v.lVal=1024; hr=m_NetCustomer.Invoke1(szMember,&v);  if(SUCCEEDED(hr)){ } }  ::CoUninitialize(); 怎么样?没有撒谎把,几行代码就把创建、调用搞定了。 郁闷,从C++拷出来代码没有格式,还的手工加…2.回调 即子调父。 主程序肯定按照自己的逻辑顺序依次调用子模块的接口,如先创建、子的相关逻辑、最后销毁

8、。如果说在实际运用中,子模块完全不会在调用父的相关功能,那么此时框架已经完全实现了,我们之前做的工作就是.难道不是吗?,但应用程序往往也有父与子相互调用,下面就来看看,子如何回调父的功能把  前面也说过,子调父往往是这样,从父身上分离出部分代码,重新封装一个dll,由子静态绑定,这步最简单、最方便.不过这显然不是正道,让人觉得别扭。  同时维护两份相同功能代码? 也许你会说,主程序从此也可以调用DLL啊,那不就一致了,你要真这样说,我的回答是,”我只是在说明问题,不涉及到架构问题"

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。