将数码相机连接到计算机时,将出现一个对话框,其中包含所有已注册的程序,可用于从相机中获取图像。现在,我想在列表中添加自己的程序,以便在单击程序项时,可以使用自己的程序从数码相机获取图像。

非常感谢你。

最佳答案

WIA有一个设备管理器对象,该对象提供了一个接口,该接口允许程序注册事件通知。

联系设备管理员

您使用IWiaDevMgr界面与设备管理器进行交互。您可以通过调用CoCreateInstance()获得指向该接口的指针:

    IWiaDevMgr *pWiaDevMgr;
    HRESULT hr;
    hr = CoCreateInstance(CLSID_WiaDevMgr,
        NULL,
        CLSCTX_LOCAL_SERVER,
        IID_IWiaDevMgr,
        (void*)&pWiaDevMgr);


注册活动程序

然后,注册事件触发时要运行的程序非常简单:

pWiaDevMgr->RegisterEventCallbackProgram(
    WIA_REGISTER_EVENT_CALLBACK,
    NULL,
    &WIA_EVENT_DEVICE_CONNECTED,
    bstrCommandline,
    bstrName,
    bstrDescription,
    bstrIcon);


命令行,名称,描述和图标都是BSTR,因为它们是通过COM界面传递的。您可以使用SysAllocString()及其朋友创建它们,也可以使用Visual C扩展或ATL提供的类来创建和管理它们。

释放设备管理器

如果您的接口没有使用支持COM的智能指针,那么不要忘记释放CoCreateInstance()所引用的引用:

    pWiaDevMgr->Release();


如果您不释放它,COM系统将找到一种惩罚您的方法,但是它可能不会立即显现出来。

取消注册

临时测试表明,当用于注册事件的所有四个参数都正确传递时,删除注册的事件才有效。电话是:

pWiaDevMgr->RegisterEventCallbackProgram(
    WIA_UNREGISTER_EVENT_CALLBACK,
    NULL,
    &WIA_EVENT_DEVICE_CONNECTED,
    bstrCommandline,
    bstrName,
    bstrDescription,
    bstrIcon);


这是一个潜在的麻烦,因为似乎没有记录在案的API可以列出已注册的事件。这意味着,如果您的安装程序注册了一个程序,那么它还应该记录所使用的参数,以便您的卸载程序可以注销该事件。

事件参数

命令行可以包含字符串%1%2,在解析命令行之前,它们将分别由触发的事件的端口名和GUID替换。

插入相机后,图标,名称和说明会显示在显示给用户的列表中。名称应短于说明。

该图标是文件名和资源标识符的组合。良好的默认值为"sti.dll,0",它将是照相机和扫描仪的通用图像。如果提供自己的图标,则该字符串几乎肯定必须包含DLL的完全限定路径。我想,如果在资源ID之前故意在路径中的任何位置(而不是作为分隔符)包含逗号,则会引起麻烦。

幕后花絮

没有记录WIA / STI存储事件列表的实际位置。但是,在regedit中进行了一些搜索,我将事件目录放置在XP SP3系统上。有人可能会想象在其他系统的类似位置可以找到它。

注册表项HKLM\SYSTEM\CurrrentControlSet\Control\StillImage\Events包含系统已知的每个事件的子项。每个键都有一个名为GUID的值,其中包含标识该事件的GUID。

例如,Connect子项中列出了设备连接的事件处理程序。

在其他位置的HKLM\SYSTEM\CurrentControlSet\Control\Class\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}键中可以找到单个WIA / STI设备的键。

请记住,这些位置没有记录在案。触摸它们需要您自担风险,您的行驶里程会有所不同,...

关于camera - 在WIA中,如何将我的程序添加到从数码相机获取图像的程序列表中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/324974/

10-09 18:18
查看更多