Skip to main content
gamedev.net
🔒 Locked

WICTextureLoader

Started by KingofNoobs Nov 27, 2012 at 6:32 PM 8 replies 4.8k views
Original Post
KingofNoobs
KingofNoobs
Hello,

I am trying to use the WICTextureLoader functions as provided by Frank Luna, and I keep branching to return E_NOINTERFACE. Here is how the code goes:

HRESULT CreateWICTextureFromMemory( _In_ ID3D11Device* d3dDevice,
_In_opt_ ID3D11DeviceContext* d3dContext,
_In_bytecount_(wicDataSize) const uint8_t* wicData,
_In_ size_t wicDataSize,
_Out_opt_ ID3D11Resource** texture,
_Out_opt_ ID3D11ShaderResourceView** textureView,
_In_ size_t maxsize
)
{
if (!d3dDevice || !wicData || (!texture && !textureView))
{
return E_INVALIDARG;
}
if ( !wicDataSize )
{
return E_FAIL;
}
#ifdef _M_AMD64
if ( wicDataSize > 0xFFFFFFFF )
return HRESULT_FROM_WIN32( ERROR_FILE_TOO_LARGE );
#endif
IWICImagingFactory* pWIC = _GetWIC();
if ( !pWIC )
return E_NOINTERFACE;

----------------
I read somewhere that this has something to do with not calling CoInitializeEx(), but since I know nothing about COM objects except for the fact that Direct3D and Windows use them heavily, I was hoping somebody could help me figure out where in my code to call CoInitializeInstanceEx() and what parameters to use, or if this is not the problem at all.

Thanks in advance.

-Dave Ottley
eppo
eppo
Not sure what _GetWIC() does, but try to manually create a Factory:

CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_IWICImagingFactory, (void**)&pWIC);
KingofNoobs
KingofNoobs
eppo,

Here is the code for _GetWIC(), which fails with REGDB_E_CLASSNOTREG:

static IWICImagingFactory* _GetWIC()
{
static IWICImagingFactory* s_Factory = nullptr;
if ( s_Factory )
return s_Factory;
HRESULT hr = CoCreateInstance(
CLSID_WICImagingFactory,
nullptr,
CLSCTX_INPROC_SERVER,
__uuidof(IWICImagingFactory),
(LPVOID*)&s_Factory
);
if ( FAILED(hr) )
{
s_Factory = nullptr;
return nullptr;
}
return s_Factory;
}
eppo
eppo
If you haven't called CoInitializeEx(), CoCreateInstance() should return something implying you haven't so.

Try changing CLSID_WICImagingFactory to CLSID_WICImagingFactory1.
KingofNoobs
KingofNoobs
Steve: I tried that link but nothing was available...

eppo: I tried adding the 1 and it worked! Wow, Microsoft madness. Can you explain why that worked?

Thanks in advance.

-Dave Ottley
KingofNoobs
KingofNoobs
This is unrelated, but I thought I'd take this opportunity to ask why when I write:

assert(buffer[imageDataStartsHere] == 89 && "Image data does not really start here.");

The error message I receive is: Expression: buffer[imageDataStartsHere] == 89 && "Image data does not really start here."

I just wanted the stuff in double quotes. Is there any way to get this?

Thanks.

-Dave Ottley
eppo
eppo
You were probably targeting the x64 platform. The old CLSID_WICImagingFactory is registered as a 32 bit COM object.

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.