簡體   English   中英

編組從托管代碼到本機代碼的字符串數組

[英]Marshalling an array of strings from managed to native code

我有一個帶有以下聲明的托管函數(接口和實現):

[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
String[] ManagedFunction()
{
    String[] foo = new String[1];
    foo[0] = "bar";
    return foo;
}

還有一個本機C ++接口,其具有與托管接口相同的方法,在該接口內部,此方法具有以下聲明:

void ManagedFunction(SAFEARRAY* foo); 

本機代碼以下列方式調用此函數:

void NativeFunction(ManagedBinding binding)
{
    CComSafeArray<BSTR> cComSafeArray;
    cComSafeArray.Create(); 
    LPSAFEARRAY safeArray = cComSafeArray.Detach();
    binding.comObject->ManagedFunction(safeArray); 
}

我不確定我做錯了什么但是在我的托管函數被調用之后, safeArray似乎有垃圾值,在將返回值編組回本機代碼時出現問題。 有沒有比.Net interop更多經驗的人能否對此有所了解? 另外,可能有必要提一下,我沒有從我的托管函數返回ValueType的問題(如果你很好奇,則是boolean ),關於返回一個String數組的事情正在搞亂。 謝謝!

1)你的函數返回SAFEARRAY ,為什么在調用函數之前分配它?
2) ManagedFunction應該返回SAFEARRAY ,所以它應該得到一個SAFEARRAY*才能返回它! 所以你應該說:

LPSAFEARRAY lpsa;
binding.comObject->ManagedFunction(&lpsa);
CComSafeArray<BSTR> cComSafeArray;
cComSafeArray.Attach(lpsa);

好吧,我終於開始工作了。 我創建了一個名為ManagedSafeArraySAFEARRAY托管代表(從這里偷來: http//social.msdn.microsoft.com/Forums/en-US/clr/thread/6641abfc-3a9c-4976-a523-43890b2b79a2/ ):

[StructLayout(LayoutKind.Sequential)]
struct ManagedSafeArray
{
    public ushort   dimensions;     // Count of dimensions in the SAFEARRAY
    public ushort   features;       // Flags to describe SAFEARRAY usage
    public uint     elementSize;    // Size of an array element
    public uint     locks;          // Number of times locked without unlocking
    public IntPtr   dataPtr;        // Pointer to the array data
    public uint     elementCount;   // Element count for first (only) dimension
    public int      lowerBound;     // Lower bound for first (only) dimension
}

我將我的方法的簽名更改為:

void ManagedMethod(ref ManagedSafeArray foo);

在我的方法中,我通過調用Marshal.AllocCoTaskMem(...)手動更新了dataPtr字段,然后復制了我希望SAFEARRAY包含的字符串。

我不知道為什么CLR無法自動將參數與本機代碼進行編組,如果有人可以嘗試解釋,我仍然會很感激。

暫無
暫無

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

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