Guide pratique pour utiliser des événements de lecture automatique dans des applications en cours d’exécution
L’interface IHWEventHandler peut être inscrite dans la table ROT (Running Object Table) afin que les applications en cours d’exécution aient accès aux événements de lecture automatique.
Les instructions suivantes décrivent comment utiliser des événements de lecture automatique dans des applications en cours d’exécution.
Instructions
Étape 1 :
Créez un nouveau composant qui implémente l’interface IHWEventHandler .
Étape 2 :
Initialisez le nouveau composant avec la valeur InitCmdLine à partir de l’entrée du gestionnaire particulier sous la clé des gestionnaires .
Cette étape est requise, car la lecture automatique n’appelle pas la méthode Initialize.
Étape 3 :
Appelez la fonction CreateHardwareEventMoniker pour obtenir un moniker qui représente votre composant et le gestionnaire d’événements que vous souhaitez appeler.
Étape 4 :
Utilisez le paramètre ppmoniker pour inscrire votre composant dans la table ROT.
Remarques
Notes
LoadLibrary peut poser des risques de sécurité. Reportez-vous à la documentation de LoadLibrary pour plus d’informations sur la façon de charger correctement des dll avec différentes versions de Windows.
typedef HRESULT (*CREATEHARDWAREEVENTMONIKER)(REFCLSID clsid, LPCWSTR pszEventHandler, IMoniker **ppmoniker);
HRESULT RegisterComponent(IUnknown* punk, DWORD* dpwToken)
{
HRESULT hr = E_FAIL;
HINSTANCE hinstShSvcs = LoadLibrary(TEXT("shsvcs.dll"));
if (hinstShSvcs)
{
CREATEHARDWAREEVENTMONIKER fct = (CREATEHARDWAREEVENTMONIKER)GetProcAddress(hinstShSvcs, "CreateHardwareEventMoniker");
if (fct)
{
IMoniker* pmoniker;
hr = fct(CLSID_App, TEXT("VideoCameraArrival"), &pmoniker);
if (SUCCEEDED(hr))
{
IRunningObjectTable *prot;
if (SUCCEEDED(GetRunningObjectTable(0, &prot)))
{
hr = prot->Register(ROTFLAGS_ALLOWANYCLIENT | ROTFLAGS_REGISTRATIONKEEPSALIVE, punk, pmoniker, &_dwRegisterROT);
prot->Release();
}
pmoniker->Release();
}
CoRegisterClassObject(CLSID_App, static_cast<IClassFactory *>(this), CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &_dwRegisterClass;
}
FreeLibrary(hinstShSvcs);
}
return hr;
}
L’appel à IRunningObjectTable :: Register requiert que le composant ait les informations AppID suivantes dans le registre.
HKEY_CLASSES_ROOT
AppID
MyApp.exe
(Default) = MyApplication
AppID [REG_SZ] = {Your GUID here}
HKEY_CLASSES_ROOT
AppID
{The same GUID here}
(Default) = MyApplication
RunAs = Interactive User