0

次のように宣言された 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
4

1 に答える 1

2

私は今、私自身の問題に対する答えを持っています。何らかの理由で、相互運用タイプが埋め込まれている場合 (VS2010 の既定値)、SAFEARRAY パラメーターで相互運用レイヤーが失敗します。この問題を回避するには、COM オブジェクトへの参照を右クリックし、Embed Interop Type を False に設定します。

この答えを見つけた功績を称えたいと思いますが、その功績は Michael Taylor に帰属します。

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

于 2012-05-21T13:17:24.200 に答える