67 lines
1.1 KiB
C
67 lines
1.1 KiB
C
|
#include "../factor.h"
|
||
|
|
||
|
void primitive_dlopen (void)
|
||
|
{
|
||
|
#ifdef FFI
|
||
|
char *path;
|
||
|
HMODULE module;
|
||
|
DLL *dll;
|
||
|
|
||
|
maybe_garbage_collection();
|
||
|
|
||
|
path = unbox_c_string();
|
||
|
module = LoadLibrary(path);
|
||
|
|
||
|
if (!module)
|
||
|
general_error(ERROR_FFI, tag_object(last_error()));
|
||
|
|
||
|
dll = allot_object(DLL_TYPE, sizeof(DLL));
|
||
|
dll->dll = module;
|
||
|
dpush(tag_object(dll));
|
||
|
#else
|
||
|
general_error(ERROR_FFI_DISABLED, F);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void primitive_dlsym (void)
|
||
|
{
|
||
|
#ifdef FFI
|
||
|
DLL *dll = untag_dll(dpop());
|
||
|
void *sym = GetProcAddress((HMODULE)dll->dll, unbox_c_string());
|
||
|
|
||
|
|
||
|
if (!sym)
|
||
|
general_error(ERROR_FFI, tag_object(last_error()));
|
||
|
|
||
|
dpush(tag_cell((CELL)sym));
|
||
|
#else
|
||
|
general_error(ERROR_FFI_DISABLED, F);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void primitive_dlclose (void)
|
||
|
{
|
||
|
#ifdef FFI
|
||
|
DLL *dll = untag_dll(dpop());
|
||
|
FreeLibrary((HMODULE)dll->dll);
|
||
|
dll->dll = NULL;
|
||
|
#else
|
||
|
general_error(ERROR_FFI_DISABLED, F);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void primitive_dlsym_self (void)
|
||
|
{
|
||
|
#ifdef FFI
|
||
|
void *sym = GetProcAddress(GetModuleHandle(NULL), unbox_c_string());
|
||
|
|
||
|
if(sym == NULL)
|
||
|
{
|
||
|
general_error(ERROR_FFI, tag_object(last_error()));
|
||
|
}
|
||
|
dpush(tag_cell((CELL)sym));
|
||
|
#else
|
||
|
general_error(ERROR_FFI_DISABLED, F);
|
||
|
#endif
|
||
|
}
|