共用方式為


管理物件的存留期

警告

UMDF 2 是最新版的 UMDF,並取代 UMDF 1。 所有新的 UMDF 驅動程式都應該使用 UMDF 2 來撰寫。 未將新功能新增至 UMDF 1,而且較新版本的 Windows 10 上不支援 UMDF 1。 通用 Windows 驅動程式必須使用 UMDF 2。

封存的 UMDF 1 範例可在Windows 11 22H2 版 - 2022 年 5 月驅動程式範例更新中找到。

如需詳細資訊,請參閱使用 UMDF 消費者入門

UMDF 會使用參考計數配置來管理 回呼物件架構物件的存留期。

管理回呼物件的參考Driver-Supplied

在大部分情況下,不需要驅動程式才能保留回呼物件的參考。 如果回呼物件介面的方法只由架構和存留期相依于回呼物件和回呼物件的配對架構物件呼叫,驅動程式就不需要保留參考。 換句話說,驅動程式或架構可以安全地呼叫物件介面的方法,這些方法在物件階層中較高。

管理 Framework 物件的參考

在 UMDF 中,一般 COM 存留期原則和 WDF 特定存留期模型會決定架構物件的存留期。 您的驅動程式必須滿足這兩個模型的準則,以便適當時間從記憶體釋放架構物件。

COM 存留期管理

在 COM 中,呼叫端通常會在使用物件時保留物件的參考,然後在呼叫端不再需要物件時釋放參考。 不過,UMDF 驅動程式不需要保留架構物件的參考。 事實上,驅動程式可以在驅動程式建立架構物件之後立即釋放架構物件參考。

例如,UMDF 範例會在呼叫 IWDFDriver::CreateDevice之後釋放裝置物件。 雖然參考會提早發行,但裝置物件會繼續存在,直到移除裝置為止,因為 WDF 物件樹狀結構會保留其參考。

由於 UMDF 會追蹤物件樹狀結構中的所有架構物件,因此驅動程式不需要保留架構物件的參考。

不過,如果您的驅動程式保留架構物件的參考,驅動程式必須在不再需要物件時釋放參考。 迴圈參考會保留到驅動程式釋放其參考為止。 為了避免迴圈參考,驅動程式通常不應該保留架構物件的明確參考。

如果驅動程式必須保留架構物件的參考,驅動程式的回呼物件也必須實作 IObjectCleanup 介面。 當驅動程式在架構物件上呼叫 IWDFObject::D eleteWdfObject 時,架構物件會呼叫其對應的回呼物件的 IObjectCleanup::OnCleanup 方法。 IObjectCleanup::OnCleanup的實作必須釋放架構物件的參考,才能讓架構完成架構物件的終止。

WDF 存留期管理

如果您要建立類型的物件,可讓您覆寫預設父代,則應該選取符合物件存留期的父系。 如需預設父物件的詳細資訊,以及驅動程式是否可以覆寫預設父代,請參閱 Framework Objects中的資料表。

如果您符合物件存留期,架構會在刪除父物件時刪除物件。 如果您不符合物件存留期,而且您想要在刪除預設父系之前刪除物件,您可以在不再需要物件時呼叫 DeleteWdfObject 來明確刪除物件。

例如,如果您建立新的要求物件,然後呼叫 IWDFDriver::CreateWdfMemory 來為此要求建立記憶體物件,您可以將要求物件指定為新記憶體物件的父代。 由於 WDF 會在刪除父物件時刪除子物件,因此驅動程式不需要呼叫 DeleteWdfObject 來刪除記憶體物件。

不過,如果沒有任何父系的存留期與物件的存留期緊密相符,而且如果您想要在刪除預設父系之前刪除物件,則必須使用明確刪除。 例如,驅動程式可以建立數個短期使用的要求物件。 在此情況下,驅動程式可以藉由在不再需要要求時明確刪除要求來節省記憶體。

同樣地,如果您要建立不允許覆寫預設父代的物件,而且如果您想要在刪除預設父代之前刪除物件,驅動程式必須明確刪除物件。