diff --git a/src/mred/mrmain.cxx b/src/mred/mrmain.cxx index 8e47f075e7..53dc400337 100644 --- a/src/mred/mrmain.cxx +++ b/src/mred/mrmain.cxx @@ -633,10 +633,10 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR ignored { /* Order matters: load dependencies first */ # ifndef MZ_PRECISE_GC - load_delayed_dll("libmzgcxxxxxxx.dll"); + load_delayed_dll(NULL, "libmzgcxxxxxxx.dll"); # endif - load_delayed_dll("libmzsch" DLL_3M_SUFFIX "xxxxxxx.dll"); - load_delayed_dll("libmred" DLL_3M_SUFFIX "xxxxxxx.dll"); + load_delayed_dll(NULL, "libmzsch" DLL_3M_SUFFIX "xxxxxxx.dll"); + load_delayed_dll(NULL, "libmred" DLL_3M_SUFFIX "xxxxxxx.dll"); record_dll_path(); return WinMain_dlls_ready(hInstance, hPrevInstance, ignored, nCmdShow); diff --git a/src/mysterx/array.cxx b/src/mysterx/array.cxx index 797f46ce13..65cc27cbbf 100644 --- a/src/mysterx/array.cxx +++ b/src/mysterx/array.cxx @@ -38,7 +38,7 @@ Scheme_Object *safeArrayElementToSchemeObject(SAFEARRAY *theArray, case VT_UI1 : char cArg; SafeArrayGetElement(theArray,allIndices,&cArg); - return scheme_make_character(cArg); + return scheme_make_char(cArg); case VT_UI2 : unsigned short usArg; diff --git a/src/mysterx/mysc/bstr.cxx b/src/mysterx/mysc/bstr.cxx index afeb6f0de0..cb26e91ab0 100644 --- a/src/mysterx/mysc/bstr.cxx +++ b/src/mysterx/mysc/bstr.cxx @@ -4,6 +4,9 @@ #include "escheme.h" +/* This indirection lets us delayload libmzsch.dll: */ +#define scheme_false (scheme_make_false()) + // fwd ref BSTR schemeToBSTR (Scheme_Object * obj); diff --git a/src/mysterx/myssink/myssink.cxx b/src/mysterx/myssink/myssink.cxx index a4a1b858fd..743358404e 100644 --- a/src/mysterx/myssink/myssink.cxx +++ b/src/mysterx/myssink/myssink.cxx @@ -8,6 +8,8 @@ #include "myssink_i.c" #include "Sink.h" +#define DLL_RELATIVE_PATH "." +#include "../../mzscheme/delayed.inc" CComModule _Module; @@ -23,6 +25,8 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) { if (dwReason == DLL_PROCESS_ATTACH) { + load_delayed_dll(hInstance, "libmzgcxxxxxxx.dll"); + load_delayed_dll(hInstance, "libmzschxxxxxxx.dll"); _Module.Init(ObjectMap, hInstance, &LIBID_MYSSINKLib); DisableThreadLibraryCalls(hInstance); } diff --git a/src/mysterx/myssink/sink.cxx b/src/mysterx/myssink/sink.cxx index 5c0598fdc7..c1739f23ee 100644 --- a/src/mysterx/myssink/sink.cxx +++ b/src/mysterx/myssink/sink.cxx @@ -10,6 +10,9 @@ #include "sink.h" #include "comtypes.h" +#define scheme_current_thread (scheme_get_current_thread()) +#define scheme_false (scheme_make_false()) + ///////////////////////////////////////////////////////////////////////////// // CSink @@ -153,31 +156,31 @@ Scheme_Object *CSink::variantToSchemeObject(VARIANTARG *pVariantArg) { case VT_NULL : - return scheme_void; + return scheme_make_void(); case VT_I1 : - return scheme_make_character(pVariantArg->cVal); + return scheme_make_char(pVariantArg->cVal); case VT_I1 | VT_BYREF : - return scheme_box(scheme_make_character(*pVariantArg->pcVal)); + return scheme_box(scheme_make_char(*pVariantArg->pcVal)); case VT_UI1 : - return scheme_make_character((char)(pVariantArg->bVal)); + return scheme_make_char((char)(pVariantArg->bVal)); case VT_UI1 | VT_BYREF : - return scheme_box(scheme_make_character((char)(*pVariantArg->pbVal))); + return scheme_box(scheme_make_char((char)(*pVariantArg->pbVal))); case VT_UI2 : - return scheme_make_character((char)(pVariantArg->bVal)); + return scheme_make_char((char)(pVariantArg->bVal)); case VT_UI2 | VT_BYREF : - return scheme_box(scheme_make_character((char)(*pVariantArg->pbVal))); + return scheme_box(scheme_make_char((char)(*pVariantArg->pbVal))); case VT_I2 : @@ -433,7 +436,7 @@ void CSink::unmarshalSchemeObject(Scheme_Object *obj,VARIANTARG *pVariantArg) { case VT_BOOL | VT_BYREF : - *(pVariantArg->pboolVal) = (val == scheme_false) ? 0 : -1; + *(pVariantArg->pboolVal) = (val == scheme_make_false()) ? 0 : -1; break; case VT_ERROR | VT_BYREF : @@ -634,3 +637,4 @@ HRESULT CSink::Invoke(DISPID dispId, REFIID, LCID, WORD, memcpy(&scheme_error_buf, &jmpSave, sizeof(mz_jmp_buf)); return S_OK; } + diff --git a/src/mysterx/mysterx.cxx b/src/mysterx/mysterx.cxx index a04a0f9bd4..1ede7fcb37 100644 --- a/src/mysterx/mysterx.cxx +++ b/src/mysterx/mysterx.cxx @@ -3124,7 +3124,7 @@ Scheme_Object *variantToSchemeObject (VARIANTARG *pVariantArg) return scheme_void; case VT_I1 : - return scheme_make_character (pVariantArg->cVal); + return scheme_make_char (pVariantArg->cVal); case VT_I2 : return scheme_make_integer_value (pVariantArg->iVal); @@ -3136,7 +3136,7 @@ Scheme_Object *variantToSchemeObject (VARIANTARG *pVariantArg) return scheme_make_integer_value_from_long_long (pVariantArg->llVal); case VT_UI1 : - return scheme_make_character ((char) (pVariantArg->bVal)); + return scheme_make_char ((char) (pVariantArg->bVal)); case VT_UI2 : return scheme_make_integer (pVariantArg->uiVal); @@ -3203,7 +3203,7 @@ Scheme_Object *retvalVariantToSchemeObject (VARIANTARG *pVariantArg) case VT_VOID : return scheme_void; case VT_BYREF|VT_UI1 : - return scheme_make_character (*pVariantArg->pcVal); + return scheme_make_char (*pVariantArg->pcVal); case VT_BYREF|VT_I2 : return scheme_make_integer (*pVariantArg->piVal); case VT_BYREF|VT_I4 : @@ -3240,7 +3240,7 @@ Scheme_Object *retvalVariantToSchemeObject (VARIANTARG *pVariantArg) case VT_BYREF|VT_VARIANT : return variantToSchemeObject (pVariantArg->pvarVal); case VT_BYREF|VT_I1 : - return scheme_make_character (*pVariantArg->pcVal); + return scheme_make_char (*pVariantArg->pcVal); case VT_BYREF|VT_UI2 : return scheme_make_integer_value_from_unsigned (*pVariantArg->puiVal); case VT_BYREF|VT_UI4 : @@ -3266,12 +3266,12 @@ void unmarshalVariant (Scheme_Object *val, VARIANTARG *pVariantArg) switch (pVariantArg->vt) { case VT_I1 | VT_BYREF : - SCHEME_BOX_VAL (val) = scheme_make_character (*pVariantArg->pcVal); + SCHEME_BOX_VAL (val) = scheme_make_char (*pVariantArg->pcVal); scheme_gc_ptr_ok (pVariantArg->pcVal); break; case VT_UI1 | VT_BYREF : - SCHEME_BOX_VAL (val) = scheme_make_character ((char) (*pVariantArg->pbVal)); + SCHEME_BOX_VAL (val) = scheme_make_char ((char) (*pVariantArg->pbVal)); scheme_gc_ptr_ok (pVariantArg->pbVal); break; @@ -5012,11 +5012,17 @@ void browserHwndMsgLoop (LPVOID p) } } +#define DLL_RELATIVE_PATH "../../../../../../../lib" +#include "../mzscheme/delayed.inc" + BOOL APIENTRY DllMain (HANDLE hModule, DWORD reason, LPVOID lpReserved) { if (reason == DLL_PROCESS_ATTACH) { + load_delayed_dll((HINSTANCE)hModule, "libmzgcxxxxxxx.dll"); + load_delayed_dll((HINSTANCE)hModule, "libmzschxxxxxxx.dll"); + hInstance = (HINSTANCE)hModule; browserHwndMutex = CreateSemaphore (NULL, 1, 1, NULL); diff --git a/src/mysterx/mysterx.h b/src/mysterx/mysterx.h index 4ab4a6669d..9d518374ab 100644 --- a/src/mysterx/mysterx.h +++ b/src/mysterx/mysterx.h @@ -898,3 +898,9 @@ extern unsigned long browserCount; scheme_signal_error(buff); }; } while (0) + +/* This indirection lets us delayload libmzsch.dll: */ +#define scheme_false (scheme_make_false()) +#define scheme_true (scheme_make_true()) +#define scheme_void (scheme_make_void()) +#define scheme_null (scheme_make_null()) diff --git a/src/mzcom/mzcom.cxx b/src/mzcom/mzcom.cxx index 8feb658766..fd36cdeacb 100644 --- a/src/mzcom/mzcom.cxx +++ b/src/mzcom/mzcom.cxx @@ -92,6 +92,9 @@ LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2) return NULL; } +#define DLL_RELATIVE_PATH "." +#include "../mzscheme/delayed.inc" + ///////////////////////////////////////////////////////////////////////////// // extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, @@ -101,6 +104,9 @@ extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT + load_delayed_dll(hInstance, "libmzgcxxxxxxx.dll"); + load_delayed_dll(hInstance, "libmzschxxxxxxx.dll"); + #if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED) HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED); #else diff --git a/src/mzcom/mzobj.cxx b/src/mzcom/mzobj.cxx index 1e93be8c05..d8eff125cb 100644 --- a/src/mzcom/mzobj.cxx +++ b/src/mzcom/mzobj.cxx @@ -23,6 +23,9 @@ static void ErrorBox(char *s) { ::MessageBox(NULL,s,"MzCOM",MB_OK); } +/* This indirection lets us delayload libmzsch.dll: */ +#define scheme_false (scheme_make_false()) + static Scheme_Object *_apply_thunk_catch_exceptions(Scheme_Object *f, Scheme_Object **exn) { Scheme_Object *v; @@ -165,7 +168,7 @@ DWORD WINAPI evalLoop(LPVOID args) { scheme_set_stack_base(NULL,1); setupSchemeEnv(); - scheme_exit = exitHandler; + scheme_set_exit(exitHandler); sleepFun = scheme_builtin_value("sleep"); pTg = (THREAD_GLOBALS *)args; diff --git a/src/mzscheme/cmdline.inc b/src/mzscheme/cmdline.inc index 64f58f2899..a835f2e59f 100644 --- a/src/mzscheme/cmdline.inc +++ b/src/mzscheme/cmdline.inc @@ -35,86 +35,9 @@ static int _coldir_offset = 19; /* Skip permanent tag */ #ifdef DOS_FILE_SYSTEM # include -# 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 */ - "lib\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(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(NULL, 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); - } - } - } -} +#define DLL_RELATIVE_PATH "lib" +#include "delayed.inc" extern # ifdef __cplusplus diff --git a/src/mzscheme/delayed.inc b/src/mzscheme/delayed.inc new file mode 100644 index 0000000000..c054ccf003 --- /dev/null +++ b/src/mzscheme/delayed.inc @@ -0,0 +1,81 @@ + +# 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); + } + } + } +} diff --git a/src/mzscheme/include/scheme.h b/src/mzscheme/include/scheme.h index cad3b4bde5..8884d9cabd 100644 --- a/src/mzscheme/include/scheme.h +++ b/src/mzscheme/include/scheme.h @@ -1534,7 +1534,9 @@ MZ_EXTERN Scheme_Thread *scheme_current_thread; MZ_EXTERN Scheme_Thread *scheme_first_thread; /* Set these global hooks (optionally): */ -MZ_EXTERN void (*scheme_exit)(int v); +typedef void (*Scheme_Exit_Proc)(int v); +MZ_EXTERN Scheme_Exit_Proc scheme_exit; +MZ_EXTERN void scheme_set_exit(Scheme_Exit_Proc p); typedef void (*scheme_console_printf_t)(char *str, ...); MZ_EXTERN scheme_console_printf_t scheme_console_printf; MZ_EXTERN scheme_console_printf_t scheme_get_console_printf(); diff --git a/src/mzscheme/main.c b/src/mzscheme/main.c index 2ed612a505..7c46ef8fe5 100644 --- a/src/mzscheme/main.c +++ b/src/mzscheme/main.c @@ -239,9 +239,9 @@ int MAIN(int argc, MAIN_char **MAIN_argv) #ifdef DOS_FILE_SYSTEM /* Order matters: load dependencies first */ # ifndef MZ_PRECISE_GC - load_delayed_dll("libmzgcxxxxxxx.dll"); + load_delayed_dll(NULL, "libmzgcxxxxxxx.dll"); # endif - load_delayed_dll("libmzsch" DLL_3M_SUFFIX "xxxxxxx.dll"); + load_delayed_dll(NULL, "libmzsch" DLL_3M_SUFFIX "xxxxxxx.dll"); record_dll_path(); #endif diff --git a/src/mzscheme/src/error.c b/src/mzscheme/src/error.c index 04f1af013a..b26170be14 100644 --- a/src/mzscheme/src/error.c +++ b/src/mzscheme/src/error.c @@ -36,7 +36,8 @@ scheme_console_printf_t scheme_console_printf; scheme_console_printf_t scheme_get_console_printf() { return scheme_console_printf; } void (*scheme_console_output)(char *str, long len); -void (*scheme_exit)(int v); +Scheme_Exit_Proc scheme_exit; +void scheme_set_exit(Scheme_Exit_Proc p) { scheme_exit = p; } #ifdef MEMORY_COUNTING_ON long scheme_misc_count; diff --git a/src/worksp-vc70/mzcom/MzCOM.vcproj b/src/worksp-vc70/mzcom/MzCOM.vcproj index ca98ce65d1..ffb3d210e0 100644 --- a/src/worksp-vc70/mzcom/MzCOM.vcproj +++ b/src/worksp-vc70/mzcom/MzCOM.vcproj @@ -35,7 +35,8 @@ Name="VCCustomBuildTool"/> @@ -60,7 +60,7 @@ + CommandLine="REGSVR32 /s ..\..\..\..\lib\$(ProjectName).dll"/> @@ -130,7 +130,7 @@ + CommandLine="REGSVR32 /s ..\..\..\..\lib\$(ProjectName).dll"/> + CommandLine="REGSVR32 /s ..\..\..\..\lib\$(ProjectName).dll"/> @@ -60,7 +61,7 @@ + CommandLine="REGSVR32 /s ..\..\..\..\lib\$(ProjectName).dll"/> @@ -128,7 +130,7 @@ + CommandLine="REGSVR32 /s ..\..\..\..\lib\$(ProjectName).dll"/> + CommandLine="REGSVR32 /s ..\..\..\..\lib\$(ProjectName).dll"/>