Aracılığıyla paylaş


WPD altyapısına destek (WpdServiceSampleDriverSample)

WPD altyapısı komut temellidir. Bir WPD uygulaması belirli bir arabirimdeki yöntemlerden birini çağırdığında, WPD seri hale getiricisi (işlem içi COM sunucusu), yöntem çağrısını sürücüye gönderdiği bir veya daha fazla komut haline dönüştürür. Sürücü de bu komutları işler ve ardından bir yanıt döndürür. Altyapı hakkında daha fazla bilgi için Mimarisine Genel Bakış konusuna bakın.

WpdMon.exe aracının aşağıdaki görüntüsünde, örnek sürücü tarafından desteklenen BeginSync yöntemini çağırmak için IPortableDeviceServiceMethods::Invoke yöntemini çağıran bir uygulamanın sonucu gösterilir:

wpd monitörü.

Önceki görüntüde, WPD seri hale getiricisi Invoke çağrısını WPD_COMMAND_SERVICE_METHODS_START_INVOKE komutuna ve ilgili parametrelere dönüştürdü. Sürücü bu komutu işledi ve WPD API'sine iki yanıt verdi. İlk yanıt, StartInvokekomutunun başarılı olduğunu ve yöntemin cihazda çalışmaya başladığını belirten WPD_COMMAND_SERVICE_METHODS_START_INVOKE sonucudur. İkinci yanıt, yöntem tamamlandığında sürücünün gönderdiği WPD_EVENT_SERVICE_METHOD_COMPLETE olayıdır. Sürücü, WPD API'sinin gerekli yöntem tamamlama ve temizleme işlemlerini gerçekleştirebilmesi için WPD_EVENT_SERVICE_METHOD_COMPLETE gönderdi. Örnek sürücü için iki yanıt, gecikme olmadan hemen izlenir; gerçek bir cihazda, bir yöntemin tamamlanması uzun sürüyorsa, iki yanıt arasında bir gecikme olabilir.

WPD_COMMAND_SERVICE_METHODS_START_INVOKE komutu ilk olarak WpdService::DispatchWpdMessage yönteminde ele alınır. Bu yöntem de WpdServiceMethod::OnStartInvoke yöntemini çağırır. İlk yöntem WpdService.cppdosyasında bulunur; ikincisi WpdServiceMethod.cppdosyasında bulunur.

WpdService.cpp'daki WpdService::D ispatchWpdMessage yönteminden aşağıdaki alıntıda, WpdServiceMethod::OnStartInvoke işleyicisine yapılan çağrı gösterilir. DispatchWpdMessage yöntemi komut parametrelerini işleyiciye geçirir. Bu komut parametreleri, Invoke yönteminin parametrelerine yönelik bir işaretçinin yanı sıra yöntem sonuçlarını alan pResults değişkenine yönelik bir işaretçiden oluşur:

HRESULT WpdService::DispatchWpdMessage(
            REFPROPERTYKEY         Command,
    __in    IPortableDeviceValues* pParams,
    __out   IPortableDeviceValues* pResults)
{
    HRESULT     hr                  = S_OK;
    LPWSTR      pszRequestFilename  = NULL;

    // Get the request filename to process the service message
    hr = pParams->GetStringValue(PRIVATE_SAMPLE_DRIVER_REQUEST_FILENAME, &pszRequestFilename);
    if (FAILED(hr))
    {
        hr = E_INVALIDARG;
        CHECK_HR(hr, "Failed to get the required requested filename");
    }

    if (hr == S_OK)
    {    
        hr = CheckRequestFilename(pszRequestFilename);
        CHECK_HR(hr, "Unknown request filename %ws received", pszRequestFilename);
    }

    if (hr == S_OK)
    {
     …
        else if (IsEqualPropertyKey(Command, WPD_COMMAND_SERVICE_METHODS_START_INVOKE))
        {
            hr = m_ServiceMethods.OnStartInvoke(pParams, pResults);
        }
        …
    return hr;
}

WpdServiceSampleDriverSample

WPD Sürücü Örnekleri