Конвертировать из HBITMAP в IWICBitmap

Я пытаюсь преобразовать 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?

0

Решение

Эта декларация

IWICImagingFactory* pWicFactory = NULL;

виновник

Вы передаете NULL указатель на функцию, которую вы затем пытаетесь использовать, вызывая ошибку.

1

Другие решения

Помимо проблемы с нулевым указателем, вы, вероятно, забыли позвонить 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 (опущено здесь для краткости) …

РЕДАКТИРОВАТЬ: Теперь я вижу в комментарии, что это действительно была ваша проблема. Я оставлю свой ответ, хотя, в случае, если другие такие же зрячие, как я ..

0

По вопросам рекламы [email protected]