Bagikan melalui


Mendaftar untuk Menjalankan Program

Anda dapat mendaftar agar BITS menjalankan program berdasarkan peristiwa pekerjaan yang ditransfer dan kesalahan, tetapi bukan peristiwa yang dimodifikasi pekerjaan. BITS menjalankan program dalam konteks pengguna.

Untuk mendaftar untuk menjalankan program

  1. Panggil metode IBackgroundCopyJob::QueryInterface untuk mengambil penunjuk antarmuka IBackgroundCopyJob2. Tentukan __uuidof(IBackgroundCopyJob2) sebagai pengidentifikasi antarmuka.

  2. Panggil metode IBackgroundCopyJob2::SetNotifyCmdLine untuk menentukan program yang akan dijalankan dan argumen apa pun yang diperlukan oleh program, seperti pengidentifikasi pekerjaan.

  3. Panggil metode IBackgroundCopyJob::SetNotifyFlags untuk menentukan kapan baris perintah dijalankan.

    Anda hanya dapat menentukan bendera peristiwa BG_NOTIFY_JOB_TRANSFERRED dan BG_NOTIFY_JOB_ERROR. Bendera BG_NOTIFY_JOB_MODIFICATION diabaikan.

Perhatikan bahwa BITS tidak akan menjalankan program jika Anda juga mendaftar untuk menerima panggilan balik COM dan penunjuk antarmuka panggilan balik valid atau metode pemberitahuan yang dipanggil BITS mengembalikan kode keberhasilan. Namun, jika metode pemberitahuan mengembalikan kode kegagalan, seperti E_FAIL, BITS akan menjalankan baris perintah.

BITS memanggil fungsi CreateProcessAsUser untuk meluncurkan program. Jika Anda menentukan string parameter, parameter pertama harus berupa nama program.

Contoh berikut menunjukkan cara mendaftar untuk menjalankan program saat peristiwa yang ditransfer pekerjaan terjadi. Contoh mengasumsikan penunjuk antarmuka IBackgroundCopyJob valid.

#define MAX_PARAMETER_LEN 4000

HRESULT hr;
IBackgroundCopyJob* pJob;
IBackgroundCopyJob2* pJob2 = NULL;
WCHAR szJobId[48];
const WCHAR *pProgram = L"c:\\PATHHERE\\PROGRAMNAMEHERE.exe";
WCHAR szParameters[MAX_PARAMETER_LEN+1];
GUID JobId;
int rc;

hr = pJob->GetId(&JobId);
if (SUCCEEDED(hr))
{
  rc = StringFromGUID2(JobId, szJobId, ARRAYSIZE(szJobId));
  if (rc)
  {
    StringCchPrintf(szParameters, MAX_PARAMETER_LEN+1, L"%s %s", pProgram, szJobId);
    pJob->QueryInterface(__uuidof(IBackgroundCopyJob2), (void**)&pJob2);
    hr = pJob2->SetNotifyCmdLine(pProgram, szParameters);
    if (SUCCEEDED(hr))
    {
      hr = pJob->SetNotifyFlags(BG_NOTIFY_JOB_TRANSFERRED);
    }
    pJob2->Release();
    if (FAILED(hr))
    {
      //Handle error - unable to register for command line notification.
    }
  }
}

Ketika status pekerjaan menjadi BG_JOB_STATE_TRANSFERRED, BITS menjalankan program yang ditentukan dalam pProgram. Contoh berikut adalah implementasi sederhana dari program yang mengambil pengidentifikasi pekerjaan sebagai argumen. Program mengasumsikan jumlah argumen yang benar diteruskan ke dalamnya.

#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include <bits.h>
#include <strsafe.h>

int wmain(int argc, wchar_t *argv[])
{
 HRESULT hr;
 IBackgroundCopyManager *pManager = NULL;
 IBackgroundCopyJob *pJob = NULL;
 GUID JobId;
 LPWSTR pDisplayName = NULL;
 LPCWSTR pSuccessString = L" completed successfully.";
 LPWSTR pMessage;

 hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
 hr = CoCreateInstance(__uuidof(BackgroundCopyManager),
  NULL, CLSCTX_LOCAL_SERVER,
  __uuidof(IBackgroundCopyManager), (void**)&pManager);

 if (pManager)
 {
  hr = CLSIDFromString(argv[1], &JobId);
  if (SUCCEEDED(hr))
  {
   hr = pManager->GetJob(JobId, &pJob);
   if (SUCCEEDED(hr))
   {
    hr = pJob->GetDisplayName(&pDisplayName);
    if (SUCCEEDED(hr))
    {
     int messageLen = wcslen(pDisplayName) + wcslen(pSuccessString) + 1;
     pMessage = (WCHAR*)malloc(messageLen * sizeof(WCHAR));
     if (pMessage)
     {
      StringCchPrintf(pMessage, messageLen,
       L"%s%s", pDisplayName, pSuccessString);
      MessageBox(HWND_DESKTOP, pMessage, L"MyProgram - Transferred", MB_OK);
      free(pMessage);
     }
     else
     {
      hr = E_OUTOFMEMORY;
     }
     CoTaskMemFree(pDisplayName);
    }
    pJob->Release();
   }
  }
  pManager->Release();
 }

 CoUninitialize();
 return(hr);
}