2014-06-11 13 views
0

비슷한 문제가 여기에 여러 번 게시되지만이 COM 예외가 발생한 이유를 알 수 없습니다.Managed에서 COM으로 UDT의 SAFEARRAY를 전달하는 E_INVALIDARG 예외

typedef [uuid(A6F30630-53F5-4688-829A-C084BA1C7DC0)] 
enum EMaskActions 
{ 
.... 
}EMaskActions; 

typedef [uuid(A6F30632-53F5-4688-829A-C084BA1C7DC0)] 
enum EMaskCallType 
{ 
.... 
}EMaskCallType; 


typedef [uuid(A6F30640-53F5-4688-829A-C084BA1C7DC0)] 
struct TAction 
{ 
    EMaskActions Action; 
    BSTR   Message; 
    long   ExData; 
}TAction; 

typedef [uuid(A6F30641-53F5-4688-829A-C084BA1C7DC0)] 
struct TMask 
{ 
    EMaskCallType CallType; 
    BSTR   MaskString; 
    TAction  Action; 
}TMask; 


[ 
    object, 
    uuid(A6F30650-53F5-4688-829A-C084BA1C7DC0),  
    oleautomation, 
    nonextensible, 
    helpstring("DecoToniConfig Interface"), 
    pointer_default(unique) 
] 
interface IDecoToniConfig : IUnknown 
{ 
    .... 

    [propget, id(6), helpstring("Returns the masks")] 
    HRESULT Masks([out, retval] SAFEARRAY(TMask)* masks); 

    [propput, id(6), helpstring("Sets the masks")] 
    HRESULT Masks([in, out] SAFEARRAY(TMask)* masks); 

}; 

지금, TMask 구조체는 TAction 필드를 포함

나는 같은 IDL 파일이 있습니다.

난 (/ sysarray ARG)없이 tlbimp와 상호 운용성 조립할 수를 만들고 IDecoToniConfig.set_Masks 대한 서명()이다

public virtual void set_masks(ref DecoToniCfgLib.TMask[] value) 

하지만 C# 1 측에서 호출시 이용 :

TMask[] masks = new TMask[1]; 
masks[0].CallType = EMaskCallType.MSKD_ACK; 
masks[0].MaskString = "12DDD#34MMM"; 
masks[0].Action = new DecoToniCfgLib.TAction(); 
_DecotoniConfig.set_masks(ref masks); 

내가 얻을 :

System.ArgumentException 

"One or more arguments are not valid. (HRESULT: 0x80070057 (E_INVALIDARG))" 

이유는 무엇입니까?

답변

0

제안 된대로 here 코드를 변경하여 구조체를 COM 인터페이스로 변환했습니다.

또한 상호 운용성에는 인터페이스 상속 (예 : 다른 인터페이스에서 파생 된 두 개의 인터페이스)을 사용하는 데 몇 가지 단점이 있다는 점에 유의해야합니다.