Я пытаюсь реализовать код WIA 2.0 в моей библиотеке VS2012 C ++ и столкнулся с проблемой с IWiaDevMgr2 :: GetImageDlg вызов, в частности, паранетер ppbstrFilePaths. Я не совсем уверен, как объявить / инициализировать это.
Из документации на http://msdn.microsoft.com/en-us/library/windows/desktop/aa359932(v=vs.85).aspx:
ppbstrFilePaths [in] TYPE — BSTR **
Адрес указателя на массив путей для проверенных файлов. Инициализируйте указатель, чтобы он указывал на массив нулевого размера (0) перед вызовом IWiaDevMgr2 :: GetImageDlg. Смотрите замечания.
Я пробовал всевозможные варианты объявления этого безуспешно, например:
// 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 решило эту проблему.
Других решений пока нет …