C#通过COM组件调用C++的代码(转载)
来源:互联网 发布:ipad淘宝怎么开店步骤 编辑:程序博客网 时间:2024/06/13 01:40
一.通过ALT建立COM组件
1、创建ATL Project
步骤1:建立一个解决方案。
步骤2:在 该解决方案中,新建一个 vc++ 的 ATL 项目。见下图
选择Dynamic-link library(DLL)
2、向工程中添加ATL对象
选择ATL Simple Object
名字为FunTest
Interface选择Custom
3、在接口中添加方法.(在类视图中)
方法名为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->引用下多了ATLProjectTestLib
3在主函数(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#项目中的生成规则。
点击项目的属性页:
设置目标平台为x86
4、做完上面这3点,大概Test应该能运行了。可以先跳到第四大点看完后再倒回来。
在实际的工程中,一般有很多个项目,假设以C#项目为主,还有一个ATL项目ATLProjectTest。而这个ATLProjectTest被Business项目(逻辑层)调用,而Business又被Form项目(用户层)调用,这都是很常见的。
在“编译”时就不能直接启动调试,要按ATLProjectTest->Business->Form的顺序一个个地生成项目。
5、有时会因为找不到Interop.ATLProjectTestLib.dll而出错,可以试着把各个项目的输出路径都改到同一个文件夹(如用户层工程的文件夹)。
四.更具体的编程
ATL与C#类型对应
ATL
C#
LONG
long
DOUBLE
double
CHAR
sbyte
VARIANT_BOOL
bool
BSTR
string
*
ref
在C++中更多用STL string来写
BSTR与STL string的转化方法
#include <iostream> #include <string> #include<comutil.h> #pragma comment(lib,"comsuppw") using namespace std; string str; //STL stringBSTR bs;bs = _com_util::ConvertStringToBSTR(str.c_str()); str = _com_util::ConvertBSTRToString(bs);
解决了字符串的问题数组和对象都好办,因为可以序列化。
有关构造函数和析构函数我还不太会怎么做,但可以自定义Init()和ToEnd()来应付一下。
- C#通过COM组件调用C++的代码(转载)
- C#调用C++COM组件
- 编写C++C#相互调用COM组件
- C/C++通过COM调用.NET托管程序集的实现(转载)
- C#调用COM组件
- C#调用C++类(以COM组件的形式)
- VC调用C#写的COM+组件
- VC调用C#写的COM+组件
- VC调用C#的COM组件(DLL)
- VC调用C#写的COM组件
- VC调用C#的COM组件(DLL)
- C#调用MATLAB的COM组件
- VC调用C#的COM组件(DLL)
- C++ 调用 C#的COM组件
- C++调用C#编写的COM组件
- JavaScript调用C#编写的COM组件
- 通过COM组件方式实现java调用C#写的DLL文件 转
- 通过COM组件方式实现java调用C#写的DLL文件
- Andorid 项目中Dialog的便捷开发,全面的样式选择.
- Android App的设计架构:MVC,MVP,MVVM经验谈
- 感知机
- 上海铁路局电话订票和网上订票流程/指南
- 【初探】判断系统位数及主机字节序
- C#通过COM组件调用C++的代码(转载)
- hdu1754线段树入门
- andriod移动开发
- Android as Bluetooth Low Energy Peripheral (GATT server).
- Java后台,安卓,iOS--3des解密后得到密文不同,解决方法
- 页面+html5+css3
- Android系统权限和root权限
- unity中多套uv set理解和应用
- 让VIM显示行号的方法