[英]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.