Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Możesz zarejestrować, aby usługa BITS wykonała program na podstawie przesyłanych zadań i zdarzeń błędu, ale nie zdarzeń modyfikacji zadania. BITS wykonuje program w kontekście użytkownika.
Aby zarejestrować się w celu wykonania programu
Wywołaj metodę IBackgroundCopyJob::QueryInterface, aby pobrać wskaźnik interfejsu IBackgroundCopyJob2. Określ __uuidof(IBackgroundCopyJob2) jako identyfikator interfejsu.
Wywołaj metodę IBackgroundCopyJob2::SetNotifyCmdLine, aby określić program do wykonania i wszelkie argumenty wymagane przez program, takie jak identyfikator zadania.
Wywołaj metodę IBackgroundCopyJob::SetNotifyFlags, aby określić, kiedy zostanie wykonany wiersz polecenia.
Można określić tylko flagi zdarzeń BG_NOTIFY_JOB_TRANSFERRED i BG_NOTIFY_JOB_ERROR. Flaga BG_NOTIFY_JOB_MODIFICATION jest ignorowana.
Należy pamiętać, że usługa BITS nie uruchomi programu, jeśli również zarejestrowałeś się do odbierania wywołań zwrotnych COM, a wskaźnik interfejsu wywołań zwrotnych jest prawidłowy lub metoda powiadamiania, którą wywołuje BITS, zwróci kod sukcesu. Jeśli jednak metoda powiadamiania zwróci kod błędu, taki jak E_FAIL, usługa BITS wykona wiersz polecenia.
Usługa BITS wywołuje funkcję CreateProcessAsUser w celu uruchomienia programu. Jeśli określisz ciąg parametru, pierwszy parametr musi być nazwą programu.
W poniższym przykładzie pokazano, jak zarejestrować się w celu wykonania programu w przypadku wystąpienia zdarzenia przeniesionego zadania. W przykładzie przyjęto założenie, że wskaźnik interfejsu IBackgroundCopyJob jest prawidłowy.
#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.
}
}
}
Gdy stan zadania stanie się BG_JOB_STATE_TRANSFERRED, usługa BITS wykonuje program określony w parametrze pProgram. Poniższy przykład to prosta implementacja programu, który przyjmuje identyfikator zadania jako argument. Program zakłada, że do programu jest przekazywana prawidłowa liczba argumentów.
#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);
}