簡體   English   中英

將object的c#數組傳遞給COM接口方法

[英]Passing a c# array of object to COM interface method

我應該將 object 數組的指針傳遞給具有以下 IDL 和 C++ 定義的 COM 接口: ZF6F87C3FDCF8B31C2FC907

UpdateItem( LONG lID, LONG lNumOfFields, FieldIdEnum* pFields, VARIANT* pvValues )

身份證:

HRESULT UpdateItem( [in] LONG lID, [in] LONG lNumOfFields, [in, size_is(lNumOfFields)] FieldIdEnum* pFields, [in, size_is(lNumOfFields)] VARIANT* pvValues );

tlbimp 生成的 C# 代碼:

UpdateItem([In] int lID, [In] int lNumOfFields, [In] ref FieldIdEnum pFields, [In][MarshalAs(UnmanagedType.Struct)] ref object pvValues);

...我試着打電話給:

FieldIdEnum[] fieldIDs = { FieldIdEnum.fi1ID, FieldIdEnum.fi2At };
object[] values = { 3, DateTime.UtcNow };
mi.UpdateItem(1, 2, ref fieldIDs[0], ref values[0]);

作為登錄和身份驗證過程的結果,我從我的系統中獲得了這個接口...... UpdateItem 方法是該接口的公共成員。

我想通過兩個數組傳遞兩個或多個字段和值對(同時)。 字段數組始終正確傳遞給 C++ 代碼。 我已經調試了 C++ 代碼,“FieldIdEnum* pFields”代表 integer 數組的第一個元素,第二個元素(pFields 1 )也是正確的。 pField[] 是一個 c 風格的數組。

但是第二個數組是具有各種元素類型的變量數組,在這種情況下是 integer 和日期時間。 這在 c++ 側顯示為 SafeArray,而不是 c_style 數組。 我也檢查了第二個數組,如果方法調用從另一個 C 代碼開始,它是一個簡單的變體數組,但 C# 嘗試將其編組到安全數組。

我已將 C# 定義更改為

UpdateItem([In] int lID, [In] int lNumOfFields, [In] ref FieldIdEnum pFields, [In] ref object pvValues);

它不起作用我總是得到一個異常,比如“值不在預期范圍內”。 “System.Exception {System.ArgumentException}”

我嘗試使用/編組各種托管/非托管類型和 Intptr,但沒有成功。

我發現了另一個具有相同/相似問題的主題,但我無法使其工作。

我應該如何將 object 數組的指針傳遞給 COM 接口?

我找到了解決方案。 我重新定義了接口方法:

        void UpdateItem([In] int lID, [In] int lNumOfFields, [In] ref FieldIdEnum pFields, [In][MarshalAs(UnmanagedType.LPArray)] object[] pvValues);

...並將其稱為:

            FieldIdEnum[] updateFieldIDs = { ..., ... };
            object[] values = { ..., ... };
            
            mi.UpdateItem(id, updateFieldIDs.Length, ref updateFieldIDs[0], values);

感謝您的指導。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM