racket/src/mzscheme/delayed.inc
Eli Barzilay 8d543c3412 set svn:eol-style
svn: r2786
2006-04-25 20:45:37 +00:00

82 lines
2.4 KiB
C++

# ifdef MZ_PRECISE_GC
# define DLL_3M_SUFFIX "3m"
# else
# define DLL_3M_SUFFIX ""
# endif
static char *_dlldir = "dLl dIRECTORy:" /* <- this tag stays, so we can find it again */
DLL_RELATIVE_PATH "\0"
/* Pad with 512 bytes: */
"****************************************************************"
"****************************************************************"
"****************************************************************"
"****************************************************************"
"****************************************************************"
"****************************************************************"
"****************************************************************"
"****************************************************************";
static int _dlldir_offset = 14; /* Skip permanent tag */
# ifdef MZ_PRECISE_GC
START_XFORM_SKIP;
# endif
static void load_delayed_dll(HINSTANCE me, char *lib)
{
/* Don't use the C library here! */
char *dlldir = _dlldir + _dlldir_offset;
if (dlldir[0] != '<') {
if ((dlldir[0] == '\\')
|| ((((dlldir[0] >= 'a') && (dlldir[0] <= 'z'))
|| ((dlldir[0] >= 'A') && (dlldir[0] <= 'Z')))
&& (dlldir[1] == ':'))) {
/* Absolute path */
} else {
/* Make it absolute, relative to this module */
char name[1024], *s;
int j, i;
GetModuleFileName(me, name, 1024);
name[1023] = 0;
s = (char *)GlobalAlloc(GMEM_FIXED, 2048);
for (i = 0; name[i]; i++) { }
--i;
while (i && (name[i] != '\\')) {
--i;
}
name[i+1] = 0;
for (i = 0; name[i]; i++) {
s[i] = name[i];
}
for (j = 0; dlldir[j]; j++, i++) {
s[i] = dlldir[j];
}
s[i] = 0;
dlldir = s;
_dlldir = s;
_dlldir_offset = 0;
}
{
char *t;
int j, i;
t = (char *)GlobalAlloc(GMEM_FIXED, 2048);
for (i = 0; dlldir[i]; i++) {
t[i] = dlldir[i];
}
if (t[i-1] != '\\')
t[i++] = '\\';
for (j = 0; lib[j]; j++, i++) {
t[i] = lib[j];
}
t[i] = 0;
if (!LoadLibrary(t)) {
MessageBox(NULL, t, "Failure: cannot load DLL", MB_OK);
ExitProcess(1);
}
}
}
}