设为首页 加入收藏

TOP

C++和C#之间互相调用经验详谈(一)
2014-02-08 13:37:06 来源: 作者: 【 】 浏览:463
Tags:之间 互相 调用 经验 详谈

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

  软件是以C++为父,DLL作为子的项目。

  开发环境:WIN7 64BIT+VS2010+MFC+ATL+COM.

  .NET环境下先以C#为例,其他的大部分一样下,不排除做一些简单或者复杂的修改。

  下面正式开始把。

  1. 动态加载 即父调子。

  COM确实是好东西(他的褒与贬我们无作评论),她的语言无关性,不仅是我们实现动态加载的关键,更是实现加载其他。NET类库的核心。如VB.NET.有了她,才是这一切皆有可能。

  由于。NET下的类库(DLL),和传统的WIN DLL 不太一样,毕竟托管的东西。她一些函数对外是不可见的,但对COM可见。因为我们就以COM方式定义一套接口,并把此接口当成普通C++的纯虚接口,来完成父到子的调用。

  这一点不论在理论上、代码上都比较简单,而且网上大多也是这样子,所以我们直接上代码。

  如下为COM接口定义。

  [ComVisible(true),

  Guid("B86D71F4-FE07-4B60-8246-F5AE283ED2A3"),

  InterfaceType(ComInterfaceType.InterfaceIsDual)

  ]

  public interface IHMI

  {

  [PreserveSig, DispId(1)]

  void OnCreate(int a);

  [PreserveSig, DispId(2)]

  void SetRect(int left, int top, int width, int height);

  //其他接类似

  }

  [ ComVisible(true),

  ClassInterface(ClassInterfaceType.AutoDual),

  ProgId("xxxxxxx.xxxxxxx") //ProgId 主程序根据此,运行时动态创建。

  ]

  C#在使用时要继承并实现接口逻辑,如下类似。

  public class CustomCOMClient : IHMI

  {

  public CustomCOMClient()

  {

  }

  [DispId(1)]

  public void OnCreate(int a)

  {

  //逻辑

  }

  [DispId(2)]

  public void SetRect(int left, int top, int width, int height)

  {

  //逻辑

  }

  }

  当然了,在建项目时,项目类型要为类库。至此类库部分已经完毕。接下来再看看主程序如何加载,以及如何调用把。

  其中在动态创建时,ProgId是关键。这一部分对搞过COM,在加上ATL的人来说,可能太简单了,'可能'这个词也许用的不太恰当,因为她不是'可能',她确实简单。不信看代码。

  ::CoInitialize(NULL);

  const OLECHAR lpszProgID[]=OLESTR("xxxxxxx.xxxxxxx"); //ProgID

  CComPtr m_NetCustomer;

  HRESULT hr = m_NetCustomer.CoCreateInstance(lpszProgID);

  if(SUCCEEDED(hr))

  {

  const LPCOLESTR szMember=OLESTR("OnCreate");

  VARIANT v;

  v.vt = VT_I4; v.lVal = 1024;

  hr = m_NetCustomer.Invoke1(szMember,&v);

  if(SUCCEEDED(hr))

  {

  }

  }

  ::CoUninitialize();

  怎么样?没有撒谎把,几行代码就把创建、调用搞定了。

  郁闷,从C++拷出来代码没有格式,还的手工加…

     

首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++编译链接的那些小事 下一篇一道H-number 数论实例

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·PostgreSQL 索引 - (2025-12-25 22:20:43)
·MySQL Node.js 连接 (2025-12-25 22:20:41)
·SQL 撤销索引、表以 (2025-12-25 22:20:38)
·Linux系统简介 (2025-12-25 21:55:25)
·Linux安装MySQL过程 (2025-12-25 21:55:22)