簡體   English   中英

無法使SAFEARRAY與Interop一起使用

[英]Can't get SAFEARRAY to work with Interop

我有一個ATL COM服務器,其中接口的方法是

STDMETHODIMP CWrapper::RUN(long iDataSize, SAFEARRAY** iData)

這個功能的MIDL看起來像

[id(1), helpstring("method RUN")] HRESULT RUN([in] long nSize, [in, size_is(nSize)] SAFEARRAY(_MyDataType*)* iData);

我使用tlbimp從該項目導入了tlb,因此可以使用本機數組。 然后,我從C#調用它,如下所示

 m_ServerWrapper.RUN(iInputs.Length,ref iInputs)

其中已經分配了Inputs,並從我的C#程序內部填充了另一個COM對象。 現在,當我調用C ++包裝器時,我有一個用於我的safearray的BadPtr ,並且從CWrapper::RUN調用隨后的COM對象失敗,並且該數組未寫入最終的dll。 它顯示為未分配。 有人知道我在做什么錯嗎? 謝謝

編輯:我應該說過,數組在C#中看起來還不錯。

EDIT2:調試器顯示IDispatch* = 0x0000000 <Bad Ptr>, 5, 0x0000000 <Bad Ptr>({lpvtbl = 0xblahblah},... iData safearray IDispatch* = 0x0000000 <Bad Ptr>, 5, 0x0000000 <Bad Ptr>({lpvtbl = 0xblahblah},...所以看來我的某些信息正在到達那里。

普通的C#數組與SAFEARRAY不同。 我認為您必須自己制作:

[StructLayout(LayoutKind.Sequential)]
struct SafeArray
{
    public ushort   dimensions;  
    public ushort   features;    
    public uint     elementSize; 
    public uint     locks;       
    public IntPtr   dataPtr;     
    public uint     elementCount;
    public int      lowerBound;  
}

然后使用Marshal.AllocCoTaskMem()創建內存。 填寫所有數據,然后將其傳遞。

暫無
暫無

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

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