我試圖寫一個VB.NET程序,將調用一個函數在一個非託管的C DLL傳遞結構是這樣的:VB.NET指針互操作問題
typedef struct {
unsigned char *msg;
int msglen;
}
我一直沒能圖out是如何處理「unsigned char * msg」部分的。你如何在VB.NET結構中定義這個?
我試圖寫一個VB.NET程序,將調用一個函數在一個非託管的C DLL傳遞結構是這樣的:VB.NET指針互操作問題
typedef struct {
unsigned char *msg;
int msglen;
}
我一直沒能圖out是如何處理「unsigned char * msg」部分的。你如何在VB.NET結構中定義這個?
這很大程度上取決於如何處理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
我需要的VB.NET代碼傳遞味精的功能,如何設置在strucutre味精指針? – 2010-09-17 17:07:36
@丹,更新了包含該答案的答案。 – JaredPar 2010-09-17 17:12:23
同樣的批評適用於此。非託管代碼使用進程堆的機率很小。 OP的唯一希望是代碼不會嘗試釋放字符串。在這種情況下,你的版本會泄漏。 – 2010-09-17 17:47:34