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

IHWEventHandler

CreateHardwareEventMoniker