首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

怎么在C#里调用COM的函数并取得返回值

2012-01-11 
如何在C#里调用COM的函数并取得返回值本人对COM一窍不通。客户提供了用COM写的dll,包括x.dll和xLib.dll(x代

如何在C#里调用COM的函数并取得返回值
本人对COM一窍不通。客户提供了用COM写的dll,包括x.dll和xLib.dll(x代表dll的名称,以Lib结束的这个dll是不是相当于Type library?)。 现在需要调用其中的一个函数,把xLib.dll加到Solution下的References里后,可以在object browser里看到函数签名,但该函数的返回值为void,而com的函数返回值都是hresult类型,。我怎么才能取得这个COM函数的返回值?
如能赐教,不胜感激!

[解决办法]
如果你非要这样做,那么手工写一个封装。用[PreserveSig]来声明不要把HRESULT吃掉。
你可以参考以下代码,记得要换掉Interface和coclass的GUID。

C# code
using System;using System.Runtime.InteropServices;using System.Runtime.CompilerServices;[ComImport][Guid("A4E23A7E-C932-4A31-8455-2F137015DCB2")]public interface INakeTTClass{    [DispId(1)]    int Add(int a, int b, out int c);    [DispId(2)]    int GetAge();} [ComImport][Guid("73269D6A-0BB4-46B8-8062-7C8DCDEE81D3")]public class NakeTTClass : INakeTTClass{    [DispId(1)]    [PreserveSig]        //<---------------    [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]    public extern int Add(int a, int b, out int c);    [DispId(2)]    [PreserveSig]        //<---------------    [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]    public extern int GetAge();}class Program{    static void Main()    {        NakeTTClass nake = new NakeTTClass();        int sum;        int hresult = nake.Add(3, 4, out sum);        // hresult == S_OK == 0        // sum == 7        hresult = nake.GetAge();        // hresult = 123    }} 

热点排行