2017-01-05 1 views
0

C#에서 C++로 작성된 OLE 인터페이스를 호출하려고합니다. 는 C++ 코드의 .ODL 파일의 서명은 다음과 같습니다C#에서 * VARIANT 매개 변수가 필요한 관리되지 않는 OLE 인터페이스를 어떻게 호출합니까?

[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() : 여기

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

가 내 C# 코드의 샘플입니다 "유형 불일치"예외가 발생합니다.

GetData3()에서 In, Out, Ref, MarshallAs(), C# 형식 등의 모든 조합을 시도했지만 성공하지 못했습니다.

C++ 코드는 변경할 수 없습니다.

의견을 보내 주시면 감사하겠습니다.

+0

참조 https://msdn.microsoft.com/en-us/library/aa719104(VS.71).aspx VARIANT는 Object입니다. –

답변

0

VARIANT 포인터를 사용하는 함수를 호출하는 방법은 두 가지가 있습니다.

sane 메서드는 매개 변수를 ref object data으로 선언하고 .NET에서 마샬링합니다. This blog post에는 자세한 내용과 예가 나와 있습니다.

다른 방법은 직접 메모리에 VARIANT 구조체를 만들고 채우고 주소를 IntPtr 매개 변수로 전달하는 것입니다. 이것은 아마도 잔인한 것이고 VARIANT는 크고 복잡하기 때문에 StructLayout이 재미 있지 않을 것입니다.

관련 문제