17
17
#include <stdbool.h>
18
18
#include "ffi.h"
19
19
20
+ #ifdef _WIN32
21
+ #include <windows.h>
22
+ static void *
23
+ get_proc_address (const char * funcname )
24
+ {
25
+ HINSTANCE hInst = GetModuleHandle (NULL );
26
+ PBYTE pImage = (PBYTE ) hInst ;
27
+ PIMAGE_DOS_HEADER pDOS = (PIMAGE_DOS_HEADER ) hInst ;
28
+ PIMAGE_NT_HEADERS pPE ;
29
+ PIMAGE_IMPORT_DESCRIPTOR pImpDesc ;
30
+
31
+ if (pDOS -> e_magic != IMAGE_DOS_SIGNATURE )
32
+ return NULL ;
33
+ pPE = (PIMAGE_NT_HEADERS )(pImage + pDOS -> e_lfanew );
34
+ if (pPE -> Signature != IMAGE_NT_SIGNATURE )
35
+ return NULL ;
36
+ pImpDesc = (PIMAGE_IMPORT_DESCRIPTOR )(pImage
37
+ + pPE -> OptionalHeader .DataDirectory [IMAGE_DIRECTORY_ENTRY_IMPORT ].VirtualAddress );
38
+ for (; pImpDesc -> FirstThunk ; ++ pImpDesc ) {
39
+ HINSTANCE hLib = LoadLibrary ((const char * )(pImage + pImpDesc -> Name ));
40
+ if (hLib ) {
41
+ void * p = GetProcAddress (hLib , "strcpy" );
42
+ if (p ) return p ;
43
+ }
44
+ }
45
+ return NULL ;
46
+ }
47
+ #endif
20
48
21
49
static mrb_value
22
50
cfunc_call (mrb_state * mrb , mrb_value self )
@@ -25,14 +53,18 @@ cfunc_call(mrb_state *mrb, mrb_value self)
25
53
mrb_value mresult_type , mname , * margs ;
26
54
void * * values = NULL ;
27
55
ffi_type * * args = NULL ;
28
-
56
+
29
57
mrb_get_args (mrb , "oo*" , & mresult_type , & mname , & margs , & margc );
30
-
58
+
31
59
void * fp = NULL ;
32
60
if (mrb_string_p (mname ) || mrb_symbol_p (mname )) {
61
+ #ifndef _WIN32
33
62
void * dlh = dlopen (NULL , RTLD_LAZY );
34
63
fp = dlsym (dlh , mrb_string_value_ptr (mrb , mname ));
35
64
dlclose (dlh );
65
+ #else
66
+ fp = get_proc_address (mrb_string_value_ptr (mrb , mname ));
67
+ #endif
36
68
37
69
if (fp == NULL ) {
38
70
mrb_raisef (mrb , E_NAME_ERROR , "can't find C function %s" , mrb_string_value_ptr (mrb , mname ));
0 commit comments