0

我正在尝试在我的 VS2012 C++ 库中实现一些 WIA 2.0 代码,并且遇到了IWiaDevMgr2::GetImageDlg调用的问题,特别是 ppbstrFilePaths 参数。我不太确定如何声明/初始化它。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa359932(v=vs.85).aspx的文档中:

ppbstrFilePaths [in] 类型 - BSTR**

指向已扫描文件的路径数组的指针的地址。在调用 IWiaDevMgr2::GetImageDlg 之前,将指针初始化为指向大小为零 (0) 的数组。见备注。

我已经尝试了各种不同的声明方式,但都没有成功,例如:

    // No scanner selection dialog, hr = E_OUTOFMEMORY
    BSTR *files = new BSTR[0];
    HRESULT hr = _pWiaDevMgr->GetImageDlg(0, NULL, *_parentHwnd, path, fileTemplate, numFiles, &files, &_pWiaItemRoot);

我也尝试过类似的事情:

    // No scanner selection dialog, hr = E_OUTOFMEMORY
    BSTR **files = (BSTR**)CoTaskMemAlloc(0);
    *files = new BSTR[0];
    HRESULT hr = _pWiaDevMgr->GetImageDlg(0, NULL, *_parentHwnd, path, fileTemplate, &numFiles, files, &_pWiaItemRoot);

谁能指出我声明和初始化此 BSTR ** 的正确方向?我不是一个大的 C++ 开发人员,在这一点上几乎是在猜测。

4

1 回答 1

0

事实证明,我的第一次尝试走在了正确的轨道上:

CComBSTR path("D:\\TestWiaScan");
CComBSTR fileTemplate("FileName");
LONG numFiles = 0L;

BSTR *files = new BSTR[0];
HRESULT hr1 = _pWiaDevMgr->GetImageDlg(0, NULL, _parentHwnd, path, fileTemplate, &numFiles, &files, &_pWiaItemRoot);
if (files)
{
    for(int i=0;i < numFiles;i++)
    {
        SysFreeString(files[i]);
    }
}
CoTaskMemFree(files);

if (_pWiaItemRoot)
{
    _pWiaItemRoot->Release();
    _pWiaItemRoot = NULL;
}

我第一次尝试失败的原因是我传入的 BSTR 参数存在问题。使用 CComBSTR 或 SysAllocString 解决了这个问题。

于 2012-11-25T21:30:33.527 回答