2010-09-17 84 views
1

我試圖寫一個VB.NET程序,將調用一個函數在一個非託管的C DLL傳遞結構是這樣的:VB.NET指針互操作問題

typedef struct { 
    unsigned char *msg; 
    int msglen;   
} 

我一直沒能圖out是如何處理「unsigned char * msg」部分的。你如何在VB.NET結構中定義這個?

回答

1

這很大程度上取決於如何處理msg字段的內存。您需要小心以釋放任何分配的內存轉移到託管代碼。

話雖這麼說,我認爲最直接的互操作類型如下

Public Structure S1 
    Public msg as IntPtr 
    Public msgLen as Integer 
End Structure 

要獲得實際msg值作爲String你需要使用下面的代碼。

Public Function GetString(ByVal s1 as S1) As String 
    return Marshal.PtrToStringAnsi(s1.msg, s1.msgLen) 
End Function 

要根據String執行以下操作創建一個S1實例。注意:如果調用函數不具有所有權,您將需要釋放在此分配的內存。

Public Function CreateS1(ByVal str As String) As S1 
    Dim local As New S1 
    local.msg = Marshal.StringToHGlobalAnsi(str) 
    local.msgLen = str.Length 
    return local 
End Function 
+0

我需要的VB.NET代碼傳遞味精的功能,如何設置在strucutre味精指針? – 2010-09-17 17:07:36

+0

@丹,更新了包含該答案的答案。 – JaredPar 2010-09-17 17:12:23

+0

同樣的批評適用於此。非託管代碼使用進程堆的機率很小。 OP的唯一希望是代碼不會嘗試釋放字符串。在這種情況下,你的版本會泄漏。 – 2010-09-17 17:47:34

1
<StructLayout(LayoutKind.Sequential)> _ 
public structure foo 
    <MarshalAs(UnmanagedType.LPStr)> dim msg as string 
    dim msgLen as integer 
end structure 
+0

這對於如何分配msg的內存以及是否終止null做了大量的假設。 – JaredPar 2010-09-17 16:45:42

+0

正確。然而,預期的信心水平超過了90%(即,我確信這與所有其他傳遞非託管字符串的示例沒有區別)。 – GSerg 2010-09-17 16:52:55