from dispatch import Dispatcher
+class DllDispatcher(Dispatcher):
+
+ def dispatchApi(self, api):
+ tag = api.name.upper()
+ print r'const char *g_sz%sDllName = NULL;' % (tag,)
+ print r'HMODULE g_h%sModule = NULL;' % (tag,)
+ print r''
+ print r'static PROC'
+ print r'_getPublicProcAddress(LPCSTR lpProcName) {'
+ print r' if (!g_h%sModule) {' % tag
+ print r' if (g_sz%sDllName) {' % tag
+ print r' g_h%sModule = LoadLibraryA(g_sz%sDllName);' % (tag, tag)
+ print r' if (!g_h%sModule) {' % tag
+ print r' os::log("warning: failed to load %%s\n", g_sz%sDllName);' % tag
+ print r' }'
+ print r' }'
+ print r' if (!g_h%sModule) {' % tag
+ print r' g_h%sModule = LoadLibraryA("%s.dll");' % (tag, api.name)
+ print r' }'
+ print r' if (!g_h%sModule) {' % tag
+ print r' os::log("error: failed to load %s.dll\n");' % api.name
+ print r' exit(1);'
+ print r' return NULL;'
+ print r' }'
+ print r' }'
+ print r' return GetProcAddress(g_h%sModule, lpProcName);' % tag
+ print r'}'
+ print r''
+
+ Dispatcher.dispatchApi(self, api)
+
+
class DllRetracer(Retracer):
def retraceApi(self, api):
- print r'''
-static LPCSTR g_szDll = "%s";
-static HMODULE g_hDll = NULL;
-
-static PROC
-_getPublicProcAddress(LPCSTR lpProcName)
-{
- if (!g_hDll) {
- g_hDll = LoadLibraryA(g_szDll);
- if (!g_hDll) {
- os::log("error: failed to load %%s\n", g_szDll);
- exit(1);
- return NULL;
- }
- }
-
- return GetProcAddress(g_hDll, lpProcName);
-}
-
-''' % api.name.upper()
-
- dispatcher = Dispatcher()
- dispatcher.dispatch_api(api)
+ dispatcher = DllDispatcher()
+ dispatcher.dispatchApi(api)
Retracer.retraceApi(self, api)