Abfragen nach dem Status des Auftrags

Standardmäßig muss eine Anwendung änderungen im status eines Auftrags abfragen. Um Änderungen im Status des Auftrags zu erfassen, rufen Sie die IBackgroundCopyJob::GetState-Methode auf. Um Änderungen an der Anzahl der übertragenen Bytes und Dateien zu erfassen, rufen Sie die IBackgroundCopyJob::GetProgress-Methode auf. Um Statusinformationen für den Antwortteil eines Upload-Reply-Auftrags abzurufen, rufen Sie die IBackgroundCopyJob2::GetReplyProgress-Methode auf. Ein Beispiel, das die Statusinformationen verwendet, finden Sie unter Ermitteln des Fortschritts eines Auftrags.

Die BG_JOB_STATE-Enumeration definiert die Zustände eines Auftrags, und die BG_JOB_PROGRESS-Struktur enthält Informationen zur Anzahl der übertragenen Bytes und Dateien.

Um die Abfrage zu verwenden, müssen Sie einen Mechanismus zum Initiieren der Abfrage erstellen. Erstellen Sie beispielsweise einen Timer, oder verwenden Sie eine Schaltfläche "Aktualisieren" auf der Benutzeroberfläche. Es kann jedoch einfacher sein, sich für Ereignisbenachrichtigungen zu registrieren und Ereignisse zu empfangen, wenn sich der Zustand oder der Fortschritt ändert. Informationen zur Ereignisbenachrichtigung finden Sie unter Registrieren eines COM-Rückrufs.

Im folgenden Beispiel wird ein Timer verwendet, um den Status eines Auftrags abzufragen. Im Beispiel wird davon ausgegangen, dass der IBackgroundCopyJob-Schnittstellenzeiger gültig ist.

HRESULT hr;
IBackgroundCopyJob* pJob;
BG_JOB_STATE State;
HANDLE hTimer = NULL;
LARGE_INTEGER liDueTime;
//IBackgroundCopyError* pError = NULL;
//BG_JOB_PROGRESS Progress;
//WCHAR *JobStates[] = { L"Queued", L"Connecting", L"Transferring",
//                       L"Suspended", L"Error", L"Transient Error",
//                       L"Transferred", L"Acknowledged", L"Canceled"
//                     };

liDueTime.QuadPart = -10000000;  //Poll every 1 second
hTimer = CreateWaitableTimer(NULL, FALSE, L"MyTimer");
SetWaitableTimer(hTimer, &liDueTime, 1000, NULL, NULL, 0);

do
{
  WaitForSingleObject(hTimer, INFINITE);

  //Use JobStates[State] to set the window text in a user interface.
  hr = pJob->GetState(&State);
  if (FAILED(hr))
  {
    //Handle error
  }

  if (BG_JOB_STATE_TRANSFERRED == State)
    //Call pJob->Complete(); to acknowledge that the transfer is complete
    //and make the file available to the client.
  else if (BG_JOB_STATE_ERROR == State || BG_JOB_STATE_TRANSIENT_ERROR == State)
    //Call pJob->GetError(&pError); to retrieve an IBackgroundCopyError interface 
    //pointer which you use to determine the cause of the error.
  else if (BG_JOB_STATE_TRANSFERRING == State)
    //Call pJob->GetProgress(&Progress); to determine the number of bytes 
    //and files transferred.
} while (BG_JOB_STATE_TRANSFERRED != State && 
         BG_JOB_STATE_ERROR != State &&
         BG_JOB_STATE_TRANSIENT_ERROR != State);
CancelWaitableTimer(hTimer);
CloseHandle(hTimer);