Registrace ke spuštění programu
Můžete se zaregistrovat, aby služba BITS spustila program na základě přenesených úloh a chybových událostí, ale ne událostí změněných úloh. BitS spustí program v kontextu uživatele.
Registrace ke spuštění programu
Zavolejte metodu IBackgroundCopyJob::QueryInterface k načtení ukazatele rozhraní IBackgroundCopyJob2. Jako identifikátor rozhraní zadejte __uuidof(IBackgroundCopyJob2).
Voláním metody IBackgroundCopyJob2::SetNotifyCmdLine určete program, který má být spuštěn, a všechny argumenty požadované programem, například identifikátor úlohy.
Zavolejte metodu IBackgroundCopyJob::SetNotifyFlags k určení, kdy se provede příkazový řádek.
Můžete zadat pouze příznaky událostí BG_NOTIFY_JOB_TRANSFERRED a BG_NOTIFY_JOB_ERROR. Příznak BG_NOTIFY_JOB_MODIFICATION se ignoruje.
Upozorňujeme, že BITS nespustí program, pokud jste také registrováni pro příjem zpětného volání COM a ukazatel rozhraní zpětného volání je platný, nebo pokud metoda oznámení volaná BITS vrací kód úspěchu. Pokud však metoda oznámení vrátí kód selhání, například E_FAIL, služba BITS spustí příkazový řádek.
BitS volá funkci CreateProcessAsUser ke spuštění programu. Pokud zadáte řetězec parametru, musí být prvním parametrem název programu.
Následující příklad ukazuje, jak se zaregistrovat ke spuštění programu, když dojde k události přenášené úlohou. Příklad předpokládá, IBackgroundCopyJob ukazatel rozhraní je platný.
#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.
}
}
}
Když se stav úlohy stane BG_JOB_STATE_TRANSFERRED, služba BITS spustí program zadaný v programu pProgram. Následující příklad je jednoduchá implementace programu, který přebírá identifikátor úlohy jako argument. Program předpokládá, že se do něj předá správný počet argumentů.
#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);
}