2017-01-05 1 views
0

Из C# Я пытаюсь вызвать OLE-интерфейс, написанный на C++. Подписи от .ODL файла C++ кода:Из C# как я могу назвать неуправляемый интерфейс OLE, для которого требуется параметр * VARIANT?

long GetData1(int* data); 
long GetData2(double* data); 
long GetData3(VARIANT* data); 

Вот пример моих C# код:

[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
public interface IMyInterface 
{ 
    [DispId(1)] 
    long GetData1 ([In, Out] ref int data); 
    [DispId(1)] 
    long GetData2 ([In, Out] ref double data); 
    [DispId(3)] 
    long GetData3 ([In, Out, MarshalAs(UnmanagedType.IUnknown)] ref IntPtr data); 
} 

GetData1() и GetData2() работает нормально, но GetData3() приводит к исключению типа «Несоответствие типа».

Для GetData3() Я пробовал каждую комбинацию типов In, Out, Ref, MarshallAs(), C# и т. Д. Я могу думать без успеха.

Обратите внимание, что код C++ не может быть изменен.

Любые предложения будут оценены.

+0

см. Https://msdn.microsoft.com/en-us/library/aa719104(VS.71).aspx VARIANT is Object –

ответ

0

Существует (по крайней мере) два способа вызова функции, которая принимает указатель VARIANT.

Звонкий метод заключается в объявлении параметра как ref object data, и .NET будет маршалировать для вас. This blog post имеет более подробную информацию и пример.

Другой метод - создать и заполнить структуру VARIANT в памяти самостоятельно и просто передать адрес как параметр IntPtr. Вероятно, это излишне, и VARIANT большой и сложный, поэтому StructLayout для него не будет весело.

Смежные вопросы