C++ Programmer's Cookbook

{C++ 基础} {C++ 高级} {C#界面,C++核心算法} {设计模式} {C#基础}

C#调用C++的COM

C#调用C++的COM比较简单,看下面的简单实例。

一 建立ATL COM ,增加接口ITest和实现函数Test,增加以下函数:
idl文件:
interface ITest : IDispatch{
    [id(
1), helpstring("method ADD")] HRESULT ADD([in] LONG x, [in] LONG y, LONG* z);
    [id(
2), helpstring("method UpperCase")] HRESULT UpperCase([in] CHAR A, CHAR* B);
    [id(
3), helpstring("method LowerCase")] HRESULT LowerCase([in] BSTR A, BSTR* B);
    [id(
4), helpstring("method Change")] HRESULT Change([in] VARIANT A, [out] VARIANT* B);
}
;

ITest文件:
 MIDL_INTERFACE("52CA8A5C-593D-4E2E-B58F-BB6C6604EAF2")
    ITest : 
public IDispatch
    
{
    
public:
        
virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ADD( 
            
/* [in] */ LONG x,
            
/* [in] */ LONG y,
            LONG 
*z) = 0;
        
        
virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE UpperCase( 
            
/* [in] */ CHAR A,
            CHAR 
*B) = 0;
        
        
virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE LowerCase( 
            
/* [in] */ BSTR A,
            BSTR 
*B) = 0;
        
        
virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Change( 
            
/* [in] */ VARIANT A,
            
/* [out] */ VARIANT *B) = 0;
        
    }
;


在Test中实现以上接口函数。

二 在C#中的使用方法

1)使用IDE中的reference来reference com,这个之前com必须先注册:


2)使用命令TLBIMP ATLCOM.tlb /out:C:\ATLCOM.dll ,然后referece生成的DLL(tblmp命令帮你注册com)。

3)TypeLibConverter
TypeLibConverter 类(位于 System.Runtime.InteropServices 命名空间中)提供了将类型库中的 coclass 和接口转换为程序集中的元数据的方法。此 API 将生成与 Tlbimp.exe 相同的元数据输出。不过,与 Tlbimp.exe 不同的是,TypeLibConverter 类可以将内存中的类型库转换为元数据。

 4)自定义包装
当类型库不可用或不正确时,一种可选的做法是在托管源代码中创建类或接口的重复定义。然后,用面向运行库的编译器来编译源代码以生成程序集中的元数据。
要手动定义 COM 类型,必须具备下列各项:

所定义的 coclass 和接口的精确描述。
可生成正确 .NET Framework 类定义的编译器,如 C# 编译器。
有关类型库到程序集转换规则的知识。

编写自定义包装是一种较少使用的高级技术。有关生成自定义包装的其他信息,请参见自定义标准包装

三 在C#的client调用COM提供的接口,我们可以看到在C#中COM的接口和函数被变换为如下:
Member of atlcom.TestClass:
public TestClass();   
public virtual void ADD(int x, int y, ref int z);
public virtual void UpperCase(sbyte A, ref sbyte B);
public virtual void Change(object A, out object B) ;  
public virtual void LowerCase(string A, ref string B);

四 更多可以参考:http://www.codeproject.com/dotnet/cominterop.asp




posted on 2007-06-04 22:44 梦在天涯 阅读(10052) 评论(1)  编辑 收藏 引用 所属分类: CPlusPlusC#/.NETCOM/ATL

评论

# re: C#调用C++的COM 2007-06-05 08:56 梦在天涯

可以参考msdn:http://msdn2.microsoft.com/zh-cn/library/367d22wa(VS.80).aspx  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

EMail:itech001#126.com

导航

统计

  • 随笔 - 461
  • 文章 - 4
  • 评论 - 746
  • 引用 - 0

常用链接

随笔分类

随笔档案

收藏夹

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

积分与排名

  • 积分 - 1625953
  • 排名 - 5

最新评论

阅读排行榜