Я пытаюсь преобразовать HBITMAP в IWICBitmap, и у меня довольно много проблем. Я нашел функцию:
CreateBitmapFromHBITMAP();
но я не могу заставить его работать. Вот как я это использую:
void camera_avtcam_ex_t::GrabAsyncFrame(ULONG frameId, IWICImagingFactory* pWicFactory, IWICBitmap** outputBitmap, bool* pAbort )
{
QueueCamFrame();
HBITMAP transferbitmap;
GetFeatureAndRunAcquisitionStart(transferbitmap); //returns transferbitmap
//as a valid HBITMAP
//This HBITMAP works, I can save it to a file and/or print
//it to the screen and the image is displayed properly
pWicFactory->CreateBitmapFromHBITMAP(transferbitmap, NULL, WICBitmapUseAlpha, outputBitmap);
}
Выполнение этой последней строки кода в функции вызывает ошибка нарушения доступа.
Прямо перед этим GrabAsyncFrame()
вызывается функция, я создаю нужные ей параметры, например:
ULONG frameId = 0;
IWICImagingFactory* pWicFactory = NULL;
IWICBitmap** outputBitmap = new IWICBitmap*;
bool* pAbort = NULL;
theCamera.GrabAsyncFrame(frameId, pWicFactory, outputBitmap, pAbort);
Я подозреваю, что для установки pWicFactory в NULL, а затем использовать его вскоре после этого. Но я не мог найти другой способ инициализации объектов IWICImagingFactory.
Итак, мой вопрос: Новый вопрос размещен ниже.
РЕДАКТИРОВАТЬ: если я пытаюсь использовать new
чтобы инициализировать pWicFactory, я получаю сообщение
Ошибка: объект абстрактного класса «IWICImagingFactory» не допускается.
EDIT2:
После подтверждения того, что установка pWicFactory в NULL была проблемой, мне нужно знать, как правильно инициализировать указатель объекта IWICImagingFactory. Вот с чем я сейчас работаю:
ULONG frameId = 0;
IWICImagingFactory* pWicFactory = NULL;
/*new code*/CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pWicFactory));
IWICBitmap** outputBitmap = new IWICBitmap*;
bool* pAbort = NULL;
theCamera.GrabAsyncFrame(frameId, pWicFactory, outputBitmap, pAbort);
Вопрос: Как правильно инициализировать указатель на объект IWICImagingFactory?
Эта декларация
IWICImagingFactory* pWicFactory = NULL;
виновник
Вы передаете NULL
указатель на функцию, которую вы затем пытаетесь использовать, вызывая ошибку.
Помимо проблемы с нулевым указателем, вы, вероятно, забыли позвонить CoInitialize
первый:
IWICImagingFactory* Factory;
…
CoInitializeEx(NULL, COINIT_MULTITHREADED); // do this during program init / before CoCreateInstance
CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&Factory));
// use factory..
CoUninitialize(); // do this before program exit.
Обратите внимание, что если вы сохраните указатель фабрики в ComPtr
(что я рекомендую), вам нужно освободить заводской интерфейс перед инициализацией. В этом случае вы должны сделать:
ComPtr<IWICImagingFactory> Factory;
…
CoInitializeEx(NULL, COINIT_MULTITHREADED); // do this during program init / before CoCreateInstance
CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&Factory));
// use factory..
Factory.Reset(); // do this before CoUninitialize
CoUninitialize(); // do this before program exit.
Также не забудьте проверить HRESULT
вернулся CoInitialize
а также CoCreateInstance
(опущено здесь для краткости) …
РЕДАКТИРОВАТЬ: Теперь я вижу в комментарии, что это действительно была ваша проблема. Я оставлю свой ответ, хотя, в случае, если другие такие же зрячие, как я ..