在WIA中,如何在从数码相机获取图像的程序列表中添加我的程序?

时间:2008-11-28 02:24:58

标签: camera wia

当我将数码相机与电脑连接时,会出现一个包含所有已注册程序的对话框,可以显示来自相机的图像。现在我想在列表中添加自己的程序,这样当我点击我的程序项目时,我可以使用自己的程序从数码相机中获取图像。

非常感谢。

2 个答案:

答案 0 :(得分:7)

WIA有一个Device Manager对象,它提供了一个允许程序注册事件通知的界面。

联系设备管理器

您使用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。

例如,

Device Connected事件处理程序列在Connect子项中。

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

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

答案 1 :(得分:0)

您需要使用WIA(Windows Image Acquisition)界面。 IWiaDevMgr提供了三种方法:RegisterEventCallbackProgram,RegisterEventCallbackCLSID和RegisterEventCallbackInterface。如果希望Windows在用户在“自动播放”对话框中单击您时启动程序,则可以使用RegisterEventCallbackProgram或RegisterEventCallbackCLSID。