通过使用IEnumSTATSTG::Next方法,我在STATSTG结构的pwcsName字段中获得了一个指向以 0 结尾的 Unicode 字符串的指针。
它的内存是由 OLE 分配的,但调用者有责任释放它。
我假设内存是使用非托管 COM 任务内存分配器分配的,但我在这里可能错了。如果假设是正确的,我会使用Marshal.FreeCoTaskMem(PtrToString)
释放该内存。
然而,论点是一个IntPtr
. 在 VB 中,我试图获得一个IntPtr
with
PtrToString = CType(pwcsName, IntPtr)
语法被接受,但字符串类型错误 ( Input string is not in a correct format.
)
因此我的问题:
我如何正确地IntPtr
从结构记录的字段中获取一个?
或者更一般地说,我怎样才能成为好公民并防止潜在的内存泄漏?
这是相关代码:
Dim oElements As IEnumSTATSTG = Nothing
oStorage.EnumElements(0, IntPtr.Zero, 0, oElements)
Dim oElement(0) As Microsoft.VisualStudio.OLE.Interop.STATSTG
Dim uiFetched As UInt32 = 0
oElements.Next(1, oElement, uiFetched)
Do While uiFetched > 0
'Work with oElement(0).pwcsName
'Attempt to free the memory occupied by the name.
Dim pName As IntPtr
pName = CType(.pwcsName, IntPtr)
Marshal.FreeCoTaskMem(pName)
Yield ...
oElements.Next(1, oElement, uiFetched)
Loop