註冊以執行程式
您可以註冊,讓 BITS 根據作業傳送和錯誤事件來執行程式,但無法執行作業修改的事件。 BITS 會在使用者的內容中執行程式。
若要註冊以執行程式
呼叫IBackgroundCopyJob::QueryInterface 方法來擷取 IBackgroundCopyJob2 介面指標。 將 __uuidof(IBackgroundCopyJob2) 指定為介面識別碼。
呼叫 IBackgroundCopyJob2::SetNotifyCmdLine 方法,指定要執行的程式,以及程式所需的任何自變數,例如作業標識符。
呼叫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時,BITS 會執行 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);
}