簡體   English   中英

從托管代碼調用SHCreateItemFromParsingName時需要釋放資源嗎?

[英]Do I need to free resources when calling SHCreateItemFromParsingName from managed code?

我有以下代碼

[DllImport("shell32.dll", CharSet = CharSet.Unicode, PreserveSig = false)]
static extern void SHCreateItemFromParsingName(
[In][MarshalAs(UnmanagedType.LPWStr)] string pszPath,
[In] IntPtr pbc,
[In][MarshalAs(UnmanagedType.LPStruct)] Guid iIdIShellItem,
[Out][MarshalAs(UnmanagedType.Interface, IidParameterIndex = 2)] out IShellItem iShellItem);


[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe")]
interface IShellItem
{
}

要使用此功能:

IShellItem iShellItem = null;
Guid iIdIShellItem = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe");
SHCreateItemFromParsingName(sourceFile, IntPtr.Zero, iIdIShellItem, out iShellItem);

它工作得很好,以后我用它來獲取OS圖標位圖。 我的問題是:

我需要釋放任何資源嗎? 有人可以告訴我如何嗎?

提前致謝。

IShellItem是一個COM接口。 使用[ComImport]屬性對其進行聲明可確保CLR為它創建一個包裝器,即RCW(運行時可調用包裝器)。 這是圍繞本機接口的托管包裝器。 RCW的行為就像普通的.NET類一樣,由垃圾收集器管理。 使用完全相同的規則,垃圾收集器遲早會發現您的程序不再具有對RCW的引用。 並放入終結器隊列。 RCW的終結器調用IUnknown :: Release()方法,這將破壞本機COM對象。

換句話說,它是自動的,就像.NET對象一樣。

從技術上講,您可以通過調用Marshal.ReleaseComObject()來加快速度。 它大致等效於IDisposable.Dispose(),這是RCW無法實現的方法,因為很難看到對COM接口指針的間接引用。 但是,使用它是一種不錯的方法,因為它錯過了一個引用,並且由於“無法使用已從其底層RCW中分離的COM對象而導致程序崩潰”,因此在它之間的某種行為完全無效。 只是不需要簡單的外殼項目引用,尤其是當您快速使用它時。

暫無
暫無

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

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