2012-05-14 1 views
0

관리 코드로 UDT의 SAFEARRAY를 포함하는 IDL 구조체 마샬링 방법 : 이제내가이 IDL 코드로 정의 된 COM 라이브러리가

struct T_GPSParamsMap 
{ 
    BSTR Key; 
    BSTR Value;  
}T_GPSParamsMap; 


struct T_FwClient 
{ 
    BSTR      Alias; 
    SMSFilterActionEnum  Action; 
    BSTR      Text; 
    int      ToCall; 
    int      ToState; 
    SAFEARRAY(T_GPSParamsMap) GpsData; 
} T_FwClient; 


struct T_SMSAction 
{ 
    int      ActionID; 
    SMSFilterActionEnum  Action; 
    BSTR      Text; 
    BSTR      Folder; 
    BSTR      DestAddress; 
    int      ToCall; 
    int      ToState; 
    SAFEARRAY(T_GPSParamsMap) GpsData; 

    VARIANT_BOOL   forwardToNotListed; 
    SAFEARRAY(T_FwClient) FwClients; 

} T_SMSAction; 

[ 
object, 
uuid(F7942BCA-5122-46BB-94DB-89F5071842E4), 
dual, 
oleautomation, 
nonextensible, 
helpstring("ISMSFilter Interface"), 
pointer_default(unique) 
] 
interface ISMSFilterWrapper : IDispatch{ 
    [id(1), helpstring("method GetFilterResult")] 
    HRESULT Init([in] BSTR schema_file_path, [out, retval] long* pVal); 

    [id(2), helpstring("method GetFilterResult")] 
    HRESULT ApplyFilter([in] T_SMS* sms, [out, retval] long* pVal); 

    [id(3), helpstring("method GetFilterResult")] 
    HRESULT GetFilterResult([in, out] T_SMSAction* ret_val, [out, retval] long* pVal); 
}; 

을,이 방법으로 C#에서 사용 :

SMSFilterLib.T_SMS smsFilter = new SMSFilterLib.T_SMS(); 
SMSFilterLib.T_SMSAction smsRule = new SMSFilterLib.T_SMSAction(); 

smsFilter.CalledParty = Convert.ToString(RadioID); 
smsFilter.CallingParty = "1"; 
smsFilter.Text = Text; 

m_smsFilter.ApplyFilter(ref smsFilter); 

int RV = m_smsFilter.GetFilterResult(ref smsRule); 

마지막 행 (이탈리아 번역) 예외 인상 :

HRESULT = -2146233054

012,351을

'System.TypeLoadException'형식의 첫 번째 예외 ' '에서 'SMSFilterLib.T_SMSAction'형식의 GpsData를 마샬링 할 수 없습니다.이 유형에 사용할 수있는 마샬링을 지원하지 않습니다 ( ).

이 COM 라이브러리가 오래된 VB6 응용 프로그램에서 사용하고 잘 작동합니다 ..

나는 비주얼 스튜디오 (참조를 통해 추가)의 표준 시계 반대 방향으로 사용하지만, 어쩌면 가질 필요가 C#에서 그것을 가져온

맞춤 CCW.

누군가 사용법을 알려 줄 수 있습니까?

안부, 다니엘

답변

1

대신, 비주얼 스튜디오 "참조 윈도우 추가"로 COM 참조를 추가 COM 라이브러리는 Visual Studio를 통해 추가 될 때 Tlbimp.exe를

와 interop 어셈블리를 만들 수 있습니다 그것은 tlbimp를 통해 "SAFEARRAY를 System.Array로 가져 오기"스위치/sysarray를 전달하여 정의를 작성합니다. VS를 사용하여

대신

, 즉 스위치를 통과하지 않고 손으로 tlbimp 사용 COM_DLL_NAME.dll /out:INTEROP_ASSEMBLY_NAME.dll Tlbimp.exe를

을과 것이다 만들고 전문 입력 배열 :

[Guid("4162E179-7E99-4783-95D9-DA9A0B3BE568")] 
    public struct T_SMSAction 
    { 
    public SMSFilterActionEnum Action; 
    public int ActionID; 
    public string DestAddress; 
    public string Folder; 
    public short forwardToNotListed; 
    public T_FwClient[] FwClients; 
    public T_GPSParamsMap[] GpsData; 
    public string Text; 
    public int ToCall; 
    public int ToState; 
    } 

감사합니다.

관련 문제