Hej, Pekar wId i anropet till LoadResource på en giltig resurs (en GIF_IMAGE) i dll:en och konverteras den rätt med MAKEINTRESOURCE (UNICODE/ANSI)? IDB_PATHICON pekar på en giltig GIF i resursen, den gjorde det innan jag uppdaterade koden till Unicode iallafall. :) Kan det ha ändrats där på något sätt? Ibland har jag fått problem när jag flyttat runt resurser för lokalisering (inte mellan ansi/unicode dock) och då har det blivit fel i _APS_NEXT_ värdena i slutet av resource.h så att jag har fått fel #define värde på resurs identifierarna. Verkar som att det är den här koden som strular: Jag tror att du kan få det här felet om inte alla dina moduler (dll filer + exe fil) är kompilerade med samma tecken alternativ (ansi/unicode/mbcs). Du hade rätt. Det var en libfil som inte var unicode kompilerad som ställde till det. Missade den eftersom kompilatorn inte klagade på den, så jag trodde allt var fine. =)Irriterande krash i dll som har MFC som shared
Har ett gäng dller som jag "jackar in" i mitt program. Har precis ändrat så att de ska stödja unicode, då har plötsligt en av dllerna slutat att fungera.
När jag anropar AFX_MANAGE_STATE(AfxGetStaticModuleState()) i början på en funktion i en av dllerna så verkar det som att den misslyckas med att göra vad den nu gör.
Båda min dller ropar på följande funktion:
HRESULT CPictureWnd::LoadResource(WORD wId, LANGID wLangId) {
LPCTSTR sTemplateName = MAKEINTRESOURCE(wId);
HINSTANCE hInst = AfxFindResourceHandle(sTemplateName, _T("GIF_IMAGE"));
HRSRC hResInfo = ::FindResourceEx(hInst, _T("GIF_IMAGE"), sTemplateName, wLangId);
if (!hResInfo) hResInfo = ::FindResourceEx(hInst, _T("GIF_IMAGE"), sTemplateName, 0x409);
HGLOBAL hResource = ::LoadResource(hInst, hResInfo);
DWORD dwSize = ::SizeofResource(hInst, hResInfo);
if (!hResource || dwSize <= 0) return E_FAIL;
LPVOID pvResourceData = ::LockResource(hResource);
if (!pvResourceData) return E_FAIL;
HGLOBAL hGlobal = ::GlobalAlloc(GMEM_MOVEABLE, dwSize);
if (!hGlobal) return E_FAIL;
LPVOID pvGlobalData = ::GlobalLock(hGlobal);
if (!pvGlobalData) return E_FAIL;
memcpy(pvGlobalData, pvResourceData, dwSize);
::GlobalUnlock(hGlobal);
LPSTREAM pStream = NULL;
HRESULT hr = ::CreateStreamOnHGlobal(hGlobal, TRUE, &pStream);
if (FAILED(hr) || !pStream) return hr;
if (m_pPicture) m_pPicture->Release(), m_pPicture = NULL;
hr = ::OleLoadPicture(pStream, dwSize, FALSE, IID_IPicture, (LPVOID *)&m_pPicture);
pStream->Release();
if (m_hWnd) Invalidate();
return hr;
}
När den ena ropar på detta vis:
CTM_MODULE_API BOOL module_mtype_init(LPMODULE_MTYPE_DATA mtype)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
mtype->pUserData = (_MODULE_MTYPE_USER_DATA*)calloc(sizeof(_MODULE_MTYPE_USER_DATA),1);
mtype->pUserData->m_picIcon = new CPictureWnd;
mtype->pUserData->m_picIcon->LoadResource(IDB_PATHICON,mtype->langId);
return TRUE;
}
Funkar det utmärkt.
När den andra dll:en försöker göra samma sak:
CTM_MODULE_API BOOL module_mtype_init(LPMODULE_MTYPE_DATA mtype)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
mtype->pUserData = (_MODULE_MTYPE_USER_DATA*)calloc(sizeof(_MODULE_MTYPE_USER_DATA),1);
mtype->pUserData->m_picIcon = new CPictureWnd;
mtype->pUserData->m_picIcon->LoadResource(IDB_PATHICON,mtype->langId);
return TRUE;
}
Så får jag en krasch, eller en debug assertion failed, i den gemensamma koden på denna raden:
HINSTANCE hInst = AfxFindResourceHandle(sTemplateName, _T("GIF_IMAGE"));
Nån som har en aning om vad det är som pågår? Mycket tacksam för hjälp då jag suttit med det här ett ganska bra tag och inte har en aning om hur jag ska lösa det.Sv: Irriterande krash i dll som har MFC som shared
/Ruben
www.rjjournal.netSv:Irriterande krash i dll som har MFC som shared
Hur ser jag om den konverteras rätt med MAKEINTRESOURCE? Konverteras resurserna olika beroende på ANSI/UNICODE?
//MarkusSv: Irriterande krash i dll som har MFC som shared
MAKEINTRESOURCE är ett makro som expanderas till MAKEINTRESOURCEA eller MAKEINTRESOURCEW beroende på om _UNICODE är definierat eller inte. Tänkte om det kanske blivit fel där.
Annars kan du väl stega in i AfxFindResourceHandle med debuggern och se vad som händer. Källkoden till MFC finns ju.
/Ruben
www.rjjournal.netSv:Irriterande krash i dll som har MFC som shared
_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle()
{ ASSERT(afxCurrentResourceHandle != NULL);
return afxCurrentResourceHandle; }
i afxwin1.inl.
hur får jag en giltig afxCurrentResourceHandle? Misslyckas AFX_MANAGE_STATE(AfxGetStaticModuleState()); med att byta? Om jag tar väck den funktionen så fungerar det, men då går den mot fel resurs.
//MarkusSv: Irriterande krash i dll som har MFC som shared
Är alla dll:er ändrade till Unicode? Tänk på att det är skilnad mellan debug och release (kanske inte alla i release eller i debug versionerna är omkomplilerade).
/Ruben
www.rjjournal.netSv:Irriterande krash i dll som har MFC som shared
jaja så kan det gå.
Tack för hjälpen!