将结构体数组传递给 COM 接口

2024-02-29

我有一个带有 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

我现在已经找到了我自己的问题的答案。由于某种原因,当嵌入互操作类型时,互操作层在 SAFEARRAY 参数上失败(VS2010 中的默认设置)。要解决此问题,请右键单击对 COM 对象的引用并将“嵌入互操作类型”设置为“False”。

我希望我能因找到这个答案而获得荣誉,但这个荣誉属于迈克尔·泰勒:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将结构体数组传递给 COM 接口 的相关文章

随机推荐