2013-12-11 5 views
3

나는 C#에서 COM 클래스를 쓰고, 하나의 함수에서 관리 코드를 호출해야합니다는 다음과 같이 관리되지 않는 C++ 코드

public void SignAttached(
     byte[] message, 
     ref byte[] signedMessage, 
     string userName = "USER" 
     ) 

}

내가 코드를 내가 exeption이 C++에서이 함수를 호출하려고 - "랭크 12,536의 SafeArray는이 순위 1.Unknown 오류 0x80131538의 배열을 예상하는 방법에 전달 된"및 초단마다 변화, C++ 코드 :

SAFEARRAY*message = SafeArrayCreateVector(VT_UI1, 0, 1); 
    SAFEARRAY*signedMessage = SafeArrayCreateVector(VT_UI1, 0, 1); 

    _bstr_t userName = "USER"; 

    pInstanse ->SignAttached(message,&signedMessage,userName); 

및 compilator 래퍼를 만들어 기능 N * .tlh 파일 :

HRESULT SignAttached (
    SAFEARRAY * message, 
    SAFEARRAY * * signedMessage, 
    _bstr_t userName); 

그리고 만약

도움 oleviewer (IDL 언어) 수출 기능 * .TLB 파일로 볼 수는 다음과 같습니다

HRESULT SignAttached(
       [in] SAFEARRAY(unsigned char) message, 
       [in, out] SAFEARRAY(unsigned char)* signedMessage, 
       [in, optional, defaultvalue("USER")] BSTR userName); 

은 아무도 도와 드릴까요?

+1

테스트중인 코드와 정확히 일치합니까? 이것은 나를 위해 잘 작동합니다. 우리가 볼 수있는 재 프로젝트를 게시 할 수 있습니까? –

+1

정말 !!!! 제발 - 제게 프로젝트를 보내면 저에게 너무 도움이됩니다 !!! – Alex

+0

여기에 업로드했습니다 : https://dl.dropboxusercontent.com/u/42400504/MyClassLibrary.zip –

답변

-1

내가 바로 잡아 보자. 배열에 대한 참조를 사용하고 있습니까? 이 부분 SAFEARRAY*signedMessage = SafeArrayCreateVector(VT_UI1, 0, 1); 다음에 pInstanse ->SignAttached(message,&signedMessage,userName); 은 으로 변환됩니다. int foo [] = {16, 2, 77, 40, 12071}; 다음으로 생각하지도 않는 pInstanse ->SignAttached(message,&foo,userName); 도 가능합니다. (포인터를 참조?) 나는이 pInstanse ->SignAttached(message,*foo,userName); 처럼 태클 것 기본적으로 int foo[]; 당신의 C#을 배열 매개 변수는 SAFEARRAY를 같이 COM에 노출되지 int* foo;

+0

일반적으로 배열에 대한 참조를 사용하지 않습니다 - 컴파일러 VS2012 * .tlh 파일에 래퍼 생성 첫 번째 매개 변수 SAFEARRAY * 및 두 번째 - SAFEARRAY **. 난 그냥 사용하고 - 매개 변수를 제대로 보낼 수 없습니다 ...그리고 내가 사용하고있는 배열은 byte foo [] (바이너리 데이터 - 내부는 무엇이든 될 수 있음)입니다. - 내 질문을 명확히 할 수 있습니다. – Alex

1

에 해당합니다. 당신은 형식 라이브러리를 볼 몇 가지 도구를 사용하여 다음 tlbexp를 사용하여 C# 코드에 대한 형식 라이브러리를 검사 할 수 있는지 확인하지만, 내 생각 엔 당신이

[in] unsigned char *

같은 것을 볼 수 있다는 것입니다

[in,out] unsigned char *

처음 두 매개 변수

방금 ​​내 컴퓨터에서 oleview.exe를 발견했습니다 (더 이상 배포되지 않았다고 생각했습니다). tlbexp로 익스포트 한 후 이것을 사용하여 typelib을 검사 할 수 있습니다. 아직 가지고 있지 않다면 Windows SDK를 설치해야한다고 생각합니다. 난 그냥 그 도구를 사용했는데, 거의뿐만 아니라 내가 기억하는대로 작동하지 않는 것 : 나를 위해, oleview.exe는

C:\Program Files (x86)\Windows Kits\8.0\bin\x86

편집 ...에있다. 어쨌든, 당신의 typelib이 SAFEARRAY를 사용하지 않을 것이라고 확신합니다.

+0

oleview.exe에 감사드립니다! 그리고 컴파일러 VS2012 * .tlh 파일에서 첫 번째 매개 변수 SAFEARRAY * 및 두 번째 - SAFEARRAY ** 래퍼를 만들기 때문에 나는 SAFEARRAY 사용합니다. – Alex

+0

질문에 tlb의 콘텐츠를 추가합니다 ... – Alex