Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Aplikace WPD mohou při volání metody IPortableDevice::Open nebo metody IPortableDeviceService::Open zadat jedinečný řetězec nebo „cookie“ v informacích o klientovi. Když tyto aplikace zaregistrují své obslužné rutiny událostí s ovladačem, ovladač vrátí tento soubor cookie s daty události. Prozkoumáním souboru cookie může aplikace určit, jestli má danou událost zpracovat.
Aplikace A například vytvoří objekt na zařízení a přijme událost WPD_EVENT_OBJECT_ADDED obsahující soubor cookie události klienta. Aplikace A nemůže aktualizovat zobrazení obsahu zařízení, protože zobrazení bylo aktualizováno v době vytvoření objektu. Pokud aplikace B vytvoří na zařízení jiný objekt, aplikace A obdrží WPD_EVENT_OBJECT_ADDED událost, která má jiný soubor cookie (nebo žádný soubor cookie). Prozkoumáním souboru cookie může aplikace A provést příslušnou akci a aktualizovat zobrazení obsahu zařízení, protože aplikace B přidala nový objekt. Vzhledem k tomu, že události WPD se vysílají do všech aplikací, jsou soubory cookie událostí nejužitečnější, když aplikace vyfiltruje události, které se aktivovaly během předchozí interakce se zařízením.
V závislosti na aplikaci může soubor cookie obsahovat název spustitelného souboru aplikace nebo CLSID nebo jedinečný identifikátor, který aplikace vytvoří, pokud může současně spouštět více instancí. Obsah řetězce není pro ovladač důležitý.
V prostředí, kde mohou být dvě nebo více klientských aplikací komunikující s vaším ovladačem (u Průzkumníka Windows je prakticky jistota, že je jedním klientem prostřednictvím rozšíření oboru názvů WPD Shell), je vhodné podporovat mechanismus událostí cookie. Je to dobrý programovací postup WPD, který může pomoct snížit provoz klienta do vašeho zařízení v reakci na události a zjednodušit zpracování událostí na straně aplikace.
Kroky k podpoře událostního cookie
Následující kroky určují, jak můžete podporovat WPD_CLIENT_EVENT_COOKIE v ovladači WPD:
- Přidejte obslužnou rutinu pro příkaz WPD_COMMAND_COMMON_SAVE_CLIENT_INFORMATION. WpdWudfSampleDriver z WDK obsahuje příklad v metodě WpdBaseDriver::OnSaveClientInfo.
- V metodě OnSaveClientInfo, jestliže aplikace nastaví WPD_CLIENT_EVENT_COOKIE v parametrech informací klienta, uložte soubor cookie s kontextovými informacemi. Některé aplikace se mohou rozhodnout neposílat tento soubor cookie, v takovém případě váš ovladač nemusí pro tento krok nic dělat.
- Když publikujete události, pokud je soubor cookie události klienta k dispozici, odešlete ho spolu s parametry události. V ukázkovém ovladači se tento kód přidá do funkce PostWpdEvent.
Následující příklad kódu ukazuje, jak WpdWudfSampleDriver zpracovává krok 2 v předchozím seznamu.
LPWSTR pszEventCookie = NULL;
hr = pClientInfo->GetStringValue(WPD_CLIENT_EVENT_COOKIE, &pszEventCookie);
if (hr == S_OK && pszEventCookie != NULL){
// Store the cookie value with the client context
pContext->EventCookie = pszEventCookie;
}
CoTaskMemFree(pszEventCookie);
Následující příklad kódu ukazuje, jak WpdWudfSampleDriver zpracovává krok tři v předchozím seznamu.
HRESULT hrEventCookie = GetClientEventCookie(pCommandParams, &pszEventCookie);
if (hrEventCookie == S_OK && pszEventCookie != NULL)
{
// Add it to the event parameters
// The application's OnEvent callback will match this with its cookie
hrEventCookie = pEventParams->SetStringValue(WPD_CLIENT_EVENT_COOKIE, pszEventCookie);
}
CoTaskMemFree(pszEventCookie);
Následující příklad kódu obsahuje osnovu pomocné funkce GetClientEventCookie. Pomocná funkce používá kontext informací klienta zadaný v parametrech příkazu k vyhledání uloženého souboru cookie klienta v kontextové mapě.
ClientContext* pClientContext = NULL;
// This is a context helper object defined by the sample
driverhr = pCommandParams->GetStringValue(WPD_PROPERTY_COMMON_CLIENT_INFORMATION_CONTEXT, &pszClientContext);
if (hr == S_OK)
{
hr = GetClientContext(pCommandParams, pszClientContext, (IUnknown**)&pClientContext);
if (hr == S_OK && pClientContext != NULL && pClientContext->EventCookie.GetLength() > 0)
{
// Allocate the cookie string to return
*ppszEventCookie = AtlAllocTaskWideString(pClientContext->EventCookie);
}
if (pClientContext != NULL)
pClientContext->Release();
CoTaskMemFree(pszClientContext);
}