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))"
이유는 무엇입니까?