Jump to content
  • Advertisement
Sign in to follow this  
KingofNoobs

WICTextureLoader

This topic is 2211 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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

Share this post


Link to post
Share on other sites
Advertisement
Not sure what _GetWIC() does, but try to manually create a Factory:

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

Share this post


Link to post
Share on other sites
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;
}

Share this post


Link to post
Share on other sites
If you haven't called CoInitializeEx(), CoCreateInstance() should return something implying you haven't so.

Try changing CLSID_WICImagingFactory to CLSID_WICImagingFactory1.

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
You were probably targeting the x64 platform. The old CLSID_WICImagingFactory is registered as a 32 bit COM object.

Share this post


Link to post
Share on other sites
Sorry somehow the link got cut.

"http://msdn.microsoft.com/en-us/library/windows/desktop/ff476904(v=vs.85).aspx" Edited by Steve_Segreto

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!