Registreren om een programma uit te voeren
U kunt BITS registreren om een programma uit te voeren op basis van overdrachte taken en foutgebeurtenissen, maar niet op basis van gewijzigde taakevenementen. BITS voert het programma uit in de context van de gebruiker.
Registreren om een programma uit te voeren
Roep de methode IBackgroundCopyJob::QueryInterface aan om een IBackgroundCopyJob2 interfaceaanwijzer op te halen. Geef __uuidof(IBackgroundCopyJob2) op als interface-id.
Roep de IBackgroundCopyJob2::SetNotifyCmdLine methode aan om het programma op te geven dat moet worden uitgevoerd en eventuele argumenten die vereist zijn voor het programma, zoals de taak-id.
Roep de IBackgroundCopyJob::SetNotifyFlags methode aan om op te geven wanneer de opdrachtregel wordt uitgevoerd.
U kunt alleen de BG_NOTIFY_JOB_TRANSFERRED en BG_NOTIFY_JOB_ERROR gebeurtenisvlagmen opgeven. De vlag BG_NOTIFY_JOB_MODIFICATION wordt genegeerd.
BITS zal het programma niet uitvoeren als u ook geregistreerd bent om COM-callbacks te ontvangen en als de callback-interfacepointer geldig is of als de meldingsmethode die BITS aanroept een succescode retourneert. Als de meldingsmethode echter een foutcode retourneert, zoals E_FAIL, voert BITS de opdrachtregel uit.
BITS roept de functie CreateProcessAsUser aan om het programma te starten. Als u een parametertekenreeks opgeeft, moet de eerste parameter de programmanaam zijn.
In het volgende voorbeeld ziet u hoe u zich registreert om een programma uit te voeren wanneer de door de taak overgedragen gebeurtenis plaatsvindt. In het voorbeeld wordt ervan uitgegaan dat de IBackgroundCopyJob interfaceaanwijzer geldig is.
#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.
}
}
}
Wanneer de status van de taak BG_JOB_STATE_TRANSFERRED wordt, voert BITS het programma uit dat is opgegeven in pProgram. Het volgende voorbeeld is een eenvoudige implementatie van een programma dat een taak-id als argument gebruikt. In het programma wordt ervan uitgegaan dat het juiste aantal argumenten wordt doorgegeven.
#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);
}