2012-09-21 6 views
0

C# 라이브러리에서 내 보낸 구조체의 배열을 C++ 코드로 전달하려고합니다. 목적은 구조체의 SAFEARRAY를 C++에서 C#으로 전달하는 것입니다.COM Interop에 의해 관리되는 구조체의 SAFEARRAY 마샬링

나는

http://limbioliong.wordpress.com/2011/07/16/marshaling-a-safearray-of-managed-structures-by-com-interop-part-2/

에서 지시를 따라했지만 호출이 오류를 받고는

0x80028019 오래된 형식이나 잘못된 형식 라이브러리

을 GetRecordInfoFromTypeInfo. 당신이 SAFEARRAY를 사용해야하는 경우 내가 일을 다음과 기대,

void MyMethod([MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] MyStruct[] data, long size); 

을 (하지만 난으로, 100 % 확실하지 않다 : 당신이있는 dispinterface를 할 필요가없는 경우

+0

이것이 도움이되지 않는 이유가 있습니까? (http://stackoverflow.com/questions/12503041/passing-an-array-of-structs-from-c-sharp-to-c- using-com-callable-wrapper/12508525 # 12508525)? SAFEARRAY가 정말로 필요합니까? 구조체 여야합니까? 디스패치 인터페이스를 구현해야합니까? –

+0

이전 시도는 C#에서 C++로 구조체를 전달하는 것이었지만 지금은 그 반대의 작업을하고 있습니다. LPArray 마샬링의 문제점은 배열의 요소 하나만 마샬링하고 가변 길이 배열은 C# 시그니처에 정의 된 배열에 바인딩되지 않는다는 것입니다. 그래서 마샬을 Safearray로 변경해야했습니다. 이전 방법이 변경없이 작동하는지 알려주십시오. – TrustyCoder

+0

이 부분은 다소 혼란 스럽습니다. "C# 라이브러리에서 C++ 코드로 내 보낸 구조체의 배열을 전달하려고합니다." LPArray가 하나의 요소 만 관리한다는 점에 놀랐습니다. (관리되지 않는 것에서 관리되는 것까지) –

답변

1

, 다음과 같은 작업을해야합니다 순간에 사용할 수 Windows 시스템)가 없습니다 :

void MyMethod([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_USERDEFINED)] MyStruct[] data); 

당신은 다음이도 작동됩니다 structclass로 변경하고, UDT 번거 로움에서 당신을 저장할 줄 수있는 경우 :

void MyMethod([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_UNKNOWN)] MyStruct[] data); 
+0

C#의 첫 번째 서명에 MyStruct [] 데이터 크기를 사용하는 방법 – TrustyCoder

+0

Ok Ok SizeParamIndex는 크기를 지정하는 매개 변수의 인덱스입니다 . – TrustyCoder

+0

어떻게 safearray back form을 C++에서 C#으로 리턴해야 하는가? C++ 및 C# 측의 메소드 서명은 무엇이되어야합니까? – John

1

구조체에 문자열이 포함되어 있습니까? 그렇다면 태그를 지정해야합니다. [MarshalAs (UnmanagedType.BStr)]. COM에는 제한이 있습니다. 구조체 배열의 문자열은 BSTR이어야합니다. TLBExp는 기본적으로 LPWSTR로 설정되고 호출이 종료됩니다. 참조 : http://msdn.microsoft.com/en-us/library/z6cfh6e6(v=vs.100).aspx

관련 문제