共用方式為


判斷裝置是否插入

請注意,由 AutoRun 自動執行觸發的 裝置安裝應用程式的行為,必須視使用者是先插入硬體還是先插入發行媒介而定。 由於獨立硬體廠商 (IHV) 通常會提供一個散發磁碟,而且磁碟只能有一個自動執行叫用的應用程式,因此自動執行叫用的裝置安裝應用程式必須判斷您的裝置是否已插入。

若要判斷裝置是否插入,應用程式可以呼叫 UpdateDriverForPlugAndPlayDevices 函式,並傳遞裝置的硬體標識符。 如果符合以下任何一種情況,則裝置已接入:

  • 函式會傳回 TRUE。 (這也會安裝裝置的驅動程式。

  • 函式會傳回 FALSE,而 Win32 GetLastError函式會傳回ERROR_NO_MORE_ITEMS。 ( 未安裝。)

如果函式傳回 FALSEGetLastError 傳回 NO_SUCH_DEVINST,則裝置未插入。 ( 未安裝。)

重新安裝斷開連線的裝置

當先前已連結的裝置現在已拔除時,裝置的 devnode 會保留在系統中,雖然它既不運作也隱藏。 在您可以重新安裝該裝置之前,必須先找到此“隱藏”devnode,並將其標記為需要重新安裝。 然後,當裝置再度插入時,即插即用會重新列舉該裝置,尋找新的驅動程式並予以安裝。

重新安裝未連接裝置:

  1. 呼叫 SetupCopyOEMInf 函式。

    SetupCopyOEMInf 函式可確保 %SystemRoot%\inf 目錄中有正確的 INF 檔案。

  2. 尋找未插電的裝置。

    呼叫 SetupDiGetClassDevs 函式。 在呼叫此函式時,清除 Flags 參數中的DIGCF_PRESENT旗標。 您必須找到 所有 裝置,而不僅僅是目前存在的裝置。 您可以在 classGuid 參數中指定特定裝置類別,以縮小搜尋結果的範圍。

  3. 尋找未拔除裝置的硬體標識碼和相容標識碼。

    SetupDiGetClassDevs 傳回 裝置資訊集 句柄,其中包含裝置類別中所有已安裝的裝置,不論是否插入裝置類別(假設您在第一個步驟中指定裝置類別)。 藉由對 SetupDiEnumDeviceInfo 函式進行後續呼叫,您可以使用此句柄列舉裝置資訊集中的所有裝置。 每次呼叫都會為您提供裝置的 SP_DEVINFO_DATA 結構體。 若要取得硬體標識碼的清單,請呼叫 SetupDiGetDeviceRegistryProperty 函式,並將 Property 參數設定為 SPDRP_HARDWAREID。 若要取得相容的標識符清單,請呼叫相同的函式,但屬性 參數設定為 SPDRP_COMPATIBLEIDS。 這兩個列表都是 MULTI-SZ 字串。

  4. 尋找裝置識別碼與上一步的硬體 ID(或相容 ID)之間的匹配項。

    請確定您執行硬體識別碼/相容標識碼與裝置識別碼之間的完整字串比較。 部分比較可能會導致不正確的相符專案。

    當您找到相符的項目時,請呼叫 CM_Get_DevNode_Status 函式,並傳遞 SP_DRVINFO_DATA。將DevInst 傳入 dnDevInst 參數中。 如果此函式傳回CR_NO_SUCH_DEVINST,則會確認裝置未連結(也就是具有虛設的 devnode)。

  5. 標記裝置。

    呼叫 SetupDiGetDeviceRegistryProperty 函式,並將 Property 參數設定為 SPDRP_CONFIGFLAGS。 當此函式傳回時,PropertyBuffer 參數會指向來自登錄的裝置 ConfigFlags 值。 將此值與 CONFIGFLAG_REINSTALL 進行位元 OR 操作(定義於 Regstr.h中)。 執行此動作之後,請呼叫 SetupDiSetDeviceRegistryProperty 函式,將 Property 參數設定為 SPDRP_CONFIGFLAGS,並將 PropertyBuffer 參數設定為裝置修改後的 ConfigFlags 值。這個動作會修改登錄的 ConfigFlags 值,以納入 CONFIGFLAG_REINSTALL 旗標。 這會導致下次重新啟動裝置時重新安裝裝置。

  6. 插入裝置。

    插即用將重新枚舉裝置,找到新的驅動程式並安裝該驅動程式。