2013-05-29 108 views
3

如何調用需要參數IntPtr的接口方法?如果我的方法需要string,則工作得很好,但如果需要IntPtr,則不會。下面是C#示例接口:通過COM interop傳遞IntPtr

[ 
    Guid("etc-etc-etc"), 
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch), 
    ComVisible(true) 
] 
public interface ICallback 
{ 
    [DispId(1)] 
    void CallbackWithString(string value); 

    [DispId(2)] 
    void CallbackWithHandle(IntPtr value); 
} 

我獲得在C#中的COM類從這個接口,並通過其發送到我的C++應用程序(通過COM)。稍後,C++應用程序將調用我的方法來將通知提供給C#應用程序。

這工作:

CComPtr<IDispatch> obj;  // My C# COM interop object, stored in my C++ app 
VARIANT arg; 

arg.vt = VT_BSTR; 
arg.bstrVal = myString; 
obj.InvokeN(L"CallbackWithString", &arg, 1); 

這不起作用:

arg.vt = VT_HANDLE;   // I also tried VT_BYREF, VT_VOID|VT_BYREF, and VT_INT_PTR 
arg.byref = myHandle; 
obj.InvokeN(L"CallbackWithHandle", &arg, 1); 

通過 「不工作」,我的意思是函數不叫,但沒有引發異常。

是否可以通過COM interop發送IntPtr?如果是這樣,怎麼樣?

回答

1

好吧,它不是VT_HANDLE,這是來自OleCtl.h的黑客。 CLR的SSCLI20版本在clr/src/vm/olevariant.cpp中有其變體編組代碼。它將VT_INT轉換爲IntPtr。然而,這是一個32位的類型,我認爲如果需要在64位代碼中工作,你需要VT_I8。

+0

感謝漢斯。如果我的參數聲明爲「IntPtr」,它仍然不起作用。我必須將其更改爲一個整數。儘管我只使用32位代碼,但我使用了'UInt64'。我寧願不這樣做,並使用'IntPtr',但這似乎是一個沮喪的祕訣。 – paddy

相關問題