다음을 통해 공유


프로그램 실행 등록

BITS가 전송된 작업 및 오류 이벤트에 따라 프로그램을 실행하도록 등록할 수 있지만 작업 수정 이벤트는 실행할 수 없습니다. BITS는 사용자의 컨텍스트에서 프로그램을 실행합니다.

프로그램을 실행하기 위해 등록하려면

  1. IBackgroundCopyJob::QueryInterface 메서드를 호출하여 IBackgroundCopyJob2 인터페이스 포인터를 검색합니다. 인터페이스 식별자로 __uuidof(IBackgroundCopyJob2)를 지정합니다.

  2. IBackgroundCopyJob2::SetNotifyCmdLine 메서드를 호출하여 실행할 프로그램 및 작업 식별자와 같은 프로그램에 필요한 인수를 지정합니다.

  3. IBackgroundCopyJob::SetNotifyFlags 메서드를 호출하여 명령줄이 실행되는 시기를 지정합니다.

    BG_NOTIFY_JOB_TRANSFERRED 및 BG_NOTIFY_JOB_ERROR 이벤트 플래그만 지정할 수 있습니다. BG_NOTIFY_JOB_MODIFICATION 플래그는 무시됩니다.

COM 콜백을 수신하도록 등록하고 콜백 인터페이스 포인터가 유효하거나 BITS가 호출하는 알림 메서드가 성공 코드를 반환하는 경우에도 BITS는 프로그램을 실행하지 않습니다. 그러나 알림 메서드가 E_FAIL 같은 오류 코드를 반환하는 경우 BITS는 명령줄을 실행합니다.

BITS는 CreateProcessAsUser 함수를 호출하여 프로그램을 시작합니다. 매개 변수 문자열을 지정하는 경우 첫 번째 매개 변수는 프로그램 이름이어야 합니다.

다음 예제에서는 작업 전송 이벤트가 발생할 때 프로그램을 실행하도록 등록하는 방법을 보여 줍니다. 이 예제에서는 IBackgroundCopyJob 인터페이스 포인터가 유효하다고 가정합니다.

#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.
    }
  }
}

작업의 상태가 BG_JOB_STATE_TRANSFERRED 비트는 pProgram에 지정된 프로그램을 실행합니다. 다음 예제는 작업 식별자를 인수로 사용하는 프로그램의 간단한 구현입니다. 프로그램은 올바른 수의 인수가 전달된다고 가정합니다.

#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);
}