传递结构的数组,以一个COM接口(Passing an array of Structs to a

2019-10-31 17:04发布

我用以下声明的IDL文件的COM接口:

typedef [uuid(D7B6C495-FFF3-11E0-8A39-08002700D831)]
struct PORT_CONFIG
{
  unsigned char  rack;
  unsigned short port;
  unsigned char  offset;
} PORT_CONFIG;

[object, uuid(D7B6C492-FFF3-11E0-8A39-08002700D831), dual, nonextensible, pointer_default(unique)]
interface IMED704 : IDispatch
{
  [id(5), helpstring("method PortConfig")] HRESULT PortConfig([in] SAFEARRAY(PORT_CONFIG) portCfg, [in, defaultvalue(-1)] VARIANT_BOOL clearInputs);
};

现在,在我的C#程序,我试图调用PortConfig方法:

PORT_CONFIG[] portCfg = new PORT_CONFIG[12];

// ...Initialize code goes here

dig704.PortConfig(portCfg, true);

然而该方案抛出时方法被调用的异常。 我究竟做错了什么?

唯一的例外是:

The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG))

更多的信息,如果我尝试以下方法:

IntPtr pointer = Marshal.GetITypeInfoForType(typeof(PORT_CONFIG));

我收到的例外是:

The specified type must be visible from COM.\r\nParameter name: t

Answer 1:

我现在回答我自己的问题。 出于某种原因,互操作层时,互操作类型被嵌入(在VS2010默认值)上SAFEARRAY参数失败。 要解决此问题,请右键单击该参考COM对象,并设置嵌入互操作类型为False。

我希望我能采取信贷搞清楚这个答案,但功劳属于迈克尔·泰勒:

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/1325d24c-db0f-43a1-9780-b68a843d816b



文章来源: Passing an array of Structs to a COM Interface