Because of circular dependencies between comctl32 and msvfw32, replace

in comctl32 delay loading of msvfw32 by manual loading.
This commit is contained in:
Eric Pouech 2001-08-18 16:09:19 +00:00 committed by Alexandre Julliard
parent 4bd80eaa5f
commit 6360917580
3 changed files with 32 additions and 10 deletions

View File

@ -428,7 +428,7 @@ libx11drv.@LIBEXT@: x11drv/libx11drv.@LIBEXT@
advapi32/libadvapi32.@LIBEXT@: libkernel32.@LIBEXT@ libntdll.@LIBEXT@
avifil32/libavifil32.@LIBEXT@: libmsvfw32.@LIBEXT@ libole32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@
comctl32/libcomctl32.@LIBEXT@: libmsvfw32.@LIBEXT@ libwinmm.@LIBEXT@ libuser32.@LIBEXT@ libgdi32.@LIBEXT@ libadvapi32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@
comctl32/libcomctl32.@LIBEXT@: libwinmm.@LIBEXT@ libuser32.@LIBEXT@ libgdi32.@LIBEXT@ libadvapi32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@
commdlg/libcomdlg32.@LIBEXT@: libshell32.@LIBEXT@ libshlwapi.@LIBEXT@ libcomctl32.@LIBEXT@ libwinspool.drv.@LIBEXT@ libuser32.@LIBEXT@ libgdi32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@
crtdll/libcrtdll.@LIBEXT@: libmsvcrt.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@
dciman32/libdciman32.@LIBEXT@: libkernel32.@LIBEXT@ libntdll.@LIBEXT@
@ -457,7 +457,7 @@ olepro32/libolepro32.@LIBEXT@: liboleaut32.@LIBEXT@ libntdll.@LIBEXT@
olesvr/libolesvr32.@LIBEXT@: libkernel32.@LIBEXT@ libntdll.@LIBEXT@
opengl32/libopengl32.@LIBEXT@: libuser32.@LIBEXT@ libx11drv.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@
psapi/libpsapi.@LIBEXT@: libkernel32.@LIBEXT@ libntdll.@LIBEXT@
quartz/libquartz.@LIBEXT@: libole2.@LIBEXT@ libntdll.@LIBEXT@
quartz/libquartz.@LIBEXT@: libole2.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@
rasapi32/librasapi32.@LIBEXT@: libkernel32.@LIBEXT@ libntdll.@LIBEXT@
richedit/libriched32.@LIBEXT@: libuser32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@
rpcrt4/librpcrt4.@LIBEXT@: libkernel32.@LIBEXT@ libntdll.@LIBEXT@

View File

@ -23,6 +23,14 @@
DEFAULT_DEBUG_CHANNEL(animate);
static struct {
HMODULE hModule;
HIC WINAPI (*fnICOpen)(DWORD, DWORD, UINT);
LRESULT WINAPI (*fnICClose)(HIC);
LRESULT WINAPI (*fnICSendMessage)(HIC, UINT, DWORD, DWORD);
DWORD WINAPIV (*fnICDecompress)(HIC,DWORD,LPBITMAPINFOHEADER,LPVOID,LPBITMAPINFOHEADER,LPVOID);
} fnIC;
typedef struct
{
/* reference to input stream (file or resource) */
@ -146,7 +154,7 @@ static void ANIMATE_Free(ANIMATE_INFO *infoPtr)
infoPtr->lpIndex = NULL;
}
if (infoPtr->hic) {
ICClose(infoPtr->hic);
fnIC.fnICClose(infoPtr->hic);
infoPtr->hic = 0;
}
if (infoPtr->inbih) {
@ -320,7 +328,7 @@ static LRESULT ANIMATE_DrawFrame(ANIMATE_INFO* infoPtr)
mmioRead(infoPtr->hMMio, infoPtr->indata, infoPtr->ash.dwSuggestedBufferSize);
if (infoPtr->hic &&
ICDecompress(infoPtr->hic, 0, infoPtr->inbih, infoPtr->indata,
fnIC.fnICDecompress(infoPtr->hic, 0, infoPtr->inbih, infoPtr->indata,
infoPtr->outbih, infoPtr->outdata) != ICERR_OK) {
LeaveCriticalSection(&infoPtr->cs);
WARN("Decompression error\n");
@ -615,13 +623,13 @@ static BOOL ANIMATE_GetAviCodec(ANIMATE_INFO *infoPtr)
}
/* try to get a decompressor for that type */
infoPtr->hic = ICOpen(ICTYPE_VIDEO, infoPtr->ash.fccHandler, ICMODE_DECOMPRESS);
infoPtr->hic = fnIC.fnICOpen(ICTYPE_VIDEO, infoPtr->ash.fccHandler, ICMODE_DECOMPRESS);
if (!infoPtr->hic) {
WARN("Can't load codec for the file\n");
return FALSE;
}
outSize = ICSendMessage(infoPtr->hic, ICM_DECOMPRESS_GET_FORMAT,
outSize = fnIC.fnICSendMessage(infoPtr->hic, ICM_DECOMPRESS_GET_FORMAT,
(DWORD)infoPtr->inbih, 0L);
infoPtr->outbih = HeapAlloc(GetProcessHeap(), 0, outSize);
@ -630,7 +638,7 @@ static BOOL ANIMATE_GetAviCodec(ANIMATE_INFO *infoPtr)
return FALSE;
}
if (ICSendMessage(infoPtr->hic, ICM_DECOMPRESS_GET_FORMAT,
if (fnIC.fnICSendMessage(infoPtr->hic, ICM_DECOMPRESS_GET_FORMAT,
(DWORD)infoPtr->inbih, (DWORD)infoPtr->outbih) != ICERR_OK) {
WARN("Can't get output BIH\n");
return FALSE;
@ -642,7 +650,7 @@ static BOOL ANIMATE_GetAviCodec(ANIMATE_INFO *infoPtr)
return FALSE;
}
if (ICSendMessage(infoPtr->hic, ICM_DECOMPRESS_BEGIN,
if (fnIC.fnICSendMessage(infoPtr->hic, ICM_DECOMPRESS_BEGIN,
(DWORD)infoPtr->inbih, (DWORD)infoPtr->outbih) != ICERR_OK) {
WARN("Can't begin decompression\n");
return FALSE;
@ -730,6 +738,22 @@ static LRESULT ANIMATE_Create(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
ANIMATE_INFO* infoPtr;
if (!fnIC.hModule) /* FIXME: not thread safe */
{
/* since there's a circular dep between msvfw32 and comctl32, we could either:
* - fix the build chain to allow this circular dep
* - handle it by hand
* AJ wants the latter :-(
*/
fnIC.hModule = LoadLibraryA("msvfw32.dll");
if (!fnIC.hModule) return FALSE;
fnIC.fnICOpen = (void*)GetProcAddress(fnIC.hModule, "ICOpen");
fnIC.fnICClose = (void*)GetProcAddress(fnIC.hModule, "ICClose");
fnIC.fnICSendMessage = (void*)GetProcAddress(fnIC.hModule, "ICSendMessage");
fnIC.fnICDecompress = (void*)GetProcAddress(fnIC.hModule, "ICDecompress");
}
/* allocate memory for info structure */
infoPtr = (ANIMATE_INFO *)COMCTL32_Alloc(sizeof(ANIMATE_INFO));
if (!infoPtr) {
@ -885,7 +909,6 @@ static LRESULT WINAPI ANIMATE_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LP
return 0;
}
void ANIMATE_Register(void)
{
WNDCLASSA wndClass;

View File

@ -3,7 +3,6 @@ type win32
init COMCTL32_LibMain
rsrc rsrc.res
import -delay msvfw32.dll
import -delay winmm.dll
import user32.dll
import gdi32.dll