C#通过COM组件调用C++的代码.doc_第1页
C#通过COM组件调用C++的代码.doc_第2页
C#通过COM组件调用C++的代码.doc_第3页
C#通过COM组件调用C++的代码.doc_第4页
C#通过COM组件调用C++的代码.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C#通过COM组件调用C+的代码这个主题在c#高级编程中有提到,可以下本电子书来看看。一下我也列出自己的学习笔记。根据网上的说法,C#调用C+至少有以下几种方法:1通过COM组件调用2通过MC+转接3利用Intptr由于我只能成功使用COM组件的方法,所以下面只谈一下这个方法。一.通过ALT建立COM组件1、创建ATL Project步骤1:建立一个解决方案。 步骤2:在 该解决方案中,新建一个 vc+ 的 ATL 项目。见下图选择Dynamic-link library(DLL)2、向工程中添加ATL对象选择ATL Simple Object名字为FunTestInterface选择Custom3、在接口中添加方法.(在类视图中)方法名为Sum,参数如下图,有三个参数接口方法的实现,这个太简单了STDMETHODIMP CFunTest:Sum(LONG num1, LONG num2, LONG* pVal) / TODO: Add your implementation code here *pVal = num1 + num2; return S_OK; 二.在C#中调用COM组件1、新建一个C# console项目,比如叫Test(winform的也是一样道理,只是Console调试更方便而已。第一次在C#中调用COM组件时,建议先用Console试试,否则会搞得一头烟)2、添加引用:在弹出的对话框中选COM子页,找到ATLProjectTest 1.0类型库(或类似的东西)就会发现在Test-引用下多了ATLProjectTestLib3在主函数(program.cs)中调用组件using System;using System.Collections.Generic;using System.Linq;using System.Text;using ATLProjectTestLib;namespace Test class Program static void Main(string args) ATLProjectTestLib.FunTestClass f1 = new FunTestClass(); Console.Write (f1.Sum(3,4); 三.很多的细节及注意事项仅按上面一步步地操作下来发现还会出错,会说找不到XX COM组件,或是COM组件没注册。实际上很多不当操作都会导致上面这个错误。只有当你生成的文件中有Interop.ATLProjectTestLib.dll时,你才算成功了。1、所有修改都要重新编译。如修改了ATL项目,首先要重新编译ATL,再重新编译C# project。当把项目移到另一台计算机,有时编译器由于ATL项目没有被修改,而不会重新编译,这就无法写注册表。这时可以把ATL项目的Debug文件夹删除,再重新编译。2、在创建ATL project时,由于一个选Dual或Custom的地方,我认为应该选Dual,但网上较多文章选Custom。以下是选了Custom后应做的补救,回到ATLProjectTest,在ATLProjectTest.idl中(或双击 类视图-IFunTest)import oaidl.idl;import ocidl.idl; object, uuid(90477521-7218-4CA1-AADC-EAF3C42AB24B), dual, /-按原做法不设这个属性,只有设了这个属性才不会错 helpstring(IFunTest 接口), pointer_default(unique)3、ATL默认按32位编译,而C#中一般是按any CPU形式,像我是64位机的就要小心了。要改一下C#项目中的生成规则。点击项目的属性页:设置目标平台为x864、做完上面这3点,大概Test应该能运行了。可以先跳到第四大点看完后再倒回来。在实际的工程中,一般有很多个项目,假设以C#项目为主,还有一个ATL项目ATLProjectTest。而这个ATLProjectTest被Business项目(逻辑层)调用,而Business又被Form项目(用户层)调用,这都是很常见的。在“编译”时就不能直接启动调试,要按ATLProjectTest-Business-Form的顺序一个个地生成项目。5、有时会因为找不到Interop.ATLProjectTestLib.dll而出错,可以试着把各个项目的输出路径都改到同一个文件夹(如用户层工程的文件夹)。四.更具体的编程ATL与C#类型对应ATLC#LONGintDOUBLEdoubleCHARsbyteVARIANT_BOOLboolBSTRstring*ref在C+中更多用STL string来写BSTR与STL string的转化方法#include #include #include #pragma comment(lib,comsuppw) using namespace std; string str; /STL stringBSTR bs;bs = _com_util:ConvertStringToBSTR(str.c_str(); str = _com_util:Con

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论