读书人

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

发布时间: 2012-01-11 22:28:46 作者: rapoo

如何在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    }} 

读书人网 >C#

热点推荐