windows-nt/Source/XPSP1/NT/multimedia/media/avi/drawdib/dcilink.h

103 lines
3.5 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*
* Dynamically link to DCI entry points.
* To implement dynamic linking
* 1. include this file in DRAWDIB.C
* 2. include a call in DRAWDIB.C to InitialiseDCI()
* 3. include a call in DRAWDIB.C to TerminateDCI()
* at the appropriate points.
* There are no other changes.
* To revert to static linking you can simply modify this file or
* #define STATIC_LINK_TO_DCI during the compilation phase.
* AND link to DCIMAN32.LIB
*
* IF the code adds calls to other DCI entry points they will have to be
* added to this file. You should find that out easily enough as there will
* be an unresolved reference on linking (assuming that DCIMAN32.LIB is not
* included in the libraries list).
*
* The process is straightforward.
* string variables are defined to hold the
* names of the DCI function entry points.
* function variables are defined for each entry point being indirected
* the code is added to GetProcAddress for each entry
* a #define is added to point the DCI entry point name at the function variable
*/
#ifdef STATIC_LINK_TO_DCI
#define InitialiseDCI() 1
#define TerminateDCI()
#else
static const char DCILIBRARY[] = "DCIMAN32.DLL";
static HINSTANCE hlibDCI;
static BOOL fDCILinked;
static UINT cDCIUsers; // Count of active DCI users
char szDCIOpenProvider[] = "DCIOpenProvider";
char szDCICloseProvider[] = "DCICloseProvider";
char szDCICreatePrimary[] = "DCICreatePrimary";
char szDCIEndAccess[] = "DCIEndAccess";
char szDCIBeginAccess[] = "DCIBeginAccess";
char szDCIDestroy[] = "DCIDestroy";
HDC (WINAPI *pfnDCIOpenProvider)(void);
void (WINAPI *pfnDCICloseProvider)(HDC hdc);
int (WINAPI *pfnDCICreatePrimary)(HDC hdc, LPDCISURFACEINFO FAR *lplpSurface);
void (WINAPI *pfnDCIEndAccess)(LPDCISURFACEINFO pdci);
DCIRVAL (WINAPI *pfnDCIBeginAccess)(LPDCISURFACEINFO pdci, int x, int y, int dx, int dy);
void (WINAPI *pfnDCIDestroy)(LPDCISURFACEINFO pdci);
BOOL InitialiseDCI(void);
__inline BOOL InitialiseDCI()
{
++cDCIUsers;
if (fDCILinked) {
// Already linked
return(TRUE);
}
hlibDCI = LoadLibraryA(DCILIBRARY);
if (hlibDCI) {
(FARPROC)pfnDCIOpenProvider = GetProcAddress(hlibDCI, szDCIOpenProvider);
(FARPROC)pfnDCICloseProvider = GetProcAddress(hlibDCI, szDCICloseProvider);
(FARPROC)pfnDCICreatePrimary = GetProcAddress(hlibDCI, szDCICreatePrimary);
(FARPROC)pfnDCIEndAccess = GetProcAddress(hlibDCI, szDCIEndAccess);
(FARPROC)pfnDCIBeginAccess = GetProcAddress(hlibDCI, szDCIBeginAccess);
(FARPROC)pfnDCIDestroy = GetProcAddress(hlibDCI, szDCIDestroy);
if (pfnDCIOpenProvider &&
pfnDCICloseProvider &&
pfnDCICreatePrimary &&
pfnDCIEndAccess &&
pfnDCIBeginAccess &&
pfnDCIDestroy) {
fDCILinked = TRUE;
} else {
--cDCIUsers;
FreeLibrary(hlibDCI);
hlibDCI = NULL;
}
}
return fDCILinked;
}
#define TerminateDCI() \
if (hlibDCI && !--cDCIUsers) {\
FreeLibrary(hlibDCI); \
fDCILinked = FALSE; \
hlibDCI = NULL; \
}
// Map the static names to the function pointers.
#define DCIOpenProvider pfnDCIOpenProvider
#define DCICloseProvider pfnDCICloseProvider
#define DCICreatePrimary pfnDCICreatePrimary
#define DCIEndAccess pfnDCIEndAccess
#define DCIBeginAccess pfnDCIBeginAccess
#define DCIDestroy pfnDCIDestroy
#endif