WIA 2.0 - IWiaDevMgr2::GetImgDlg() - 如何声明/初始化 ppbstrFilePath

WIA 2.0 - IWiaDevMgr2::GetImgDlg() - How to declare/init the ppbstrFilePaths parameter

本文关键字:声明 初始化 ppbstrFilePath 何声明 GetImgDlg WIA IWiaDevMgr2      更新时间:2023-10-16

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

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

ppbstr文件路径 [in] TYPE - 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++开发人员,在这一点上几乎是猜测。

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

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 解决了这个问题。