如何在正在运行的应用程序中使用自动播放事件

IHWEventHandler 接口可以在运行的对象表中注册 (ROT) ,以便正在运行的应用程序有权访问自动播放事件。

以下说明介绍了如何在正在运行的应用程序中使用自动播放事件。

Instructions

步骤 1:

创建实现 IHWEventHandler 接口的新组件。

步骤 2:

使用 处理程序键下 特定处理程序条目中的 InitCmdLine 值初始化新组件。

此步骤是必需的,因为自动播放不调用 Initialize 方法。

步骤 3:

调用 CreateHardwareEventMoniker 函数以获取表示组件和要调用的事件处理程序的名字对象。

步骤 4:

使用 ppmoniker 参数在 ROT 中注册组件。

备注

注意

LoadLibrary 可能会带来安全风险。 有关如何使用不同版本的 Windows 正确加载 DLL 的信息,请参阅 LoadLibrary 文档。

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;
}

调用 IRunningObjectTable::Register 要求组件在注册表中具有以下 AppID 信息。

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