#include <errno.h>
#endif /* WIN32 */
-#define DELAYIMP_INSECURE_WRITABLE_HOOKS
-
#include "loadlib.h"
#include "pgenlist.h"
#endif /* WIN32 */
#if defined(_MSC_DELAY_LOAD_IMPORT)
-#if (_MSC_VER < 1300)
+/*
+ * Error hook function for delay load import.
+ * Try to load a DLL based on psqlodbc path.
+ */
+#if (_MSC_VER >= 1900) /* vc14 or later */
+#define TRY_DLI_HOOK \
+ __try {
+#define RELEASE_NOTIFY_HOOK
+#elif (_MSC_VER < 1300) /* vc6 */
+extern PfnDliHook __pfnDliFailureHook;
+extern PfnDliHook __pfnDliNotifyHook;
#define TRY_DLI_HOOK \
__try { \
__pfnDliFailureHook = DliErrorHook; \
__pfnDliNotifyHook = DliErrorHook;
#define RELEASE_NOTIFY_HOOK \
__pfnDliNotifyHook = NULL;
-#else
+#else /* vc7 ~ 12 */
+extern PfnDliHook __pfnDliFailureHook2;
+extern PfnDliHook __pfnDliNotifyHook2;
#define TRY_DLI_HOOK \
__try { \
__pfnDliFailureHook2 = DliErrorHook; \
__pfnDliNotifyHook2 = NULL;
#endif /* _MSC_VER */
#else
-#define TRY_DLI_HOOK
+#define TRY_DLI_HOOK \
+ __try {
#define RELEASE_NOTIFY_HOOK
#endif /* _MSC_DELAY_LOAD_IMPORT */
#if defined(_MSC_DELAY_LOAD_IMPORT)
static BOOL loaded_pgenlist = FALSE;
+static HMODULE enlist_module = NULL;
static BOOL loaded_psqlodbc = FALSE;
/*
* Load a DLL based on psqlodbc path.
*/
-static HMODULE MODULE_load_from_psqlodbc_path(const char *module_name)
+HMODULE MODULE_load_from_psqlodbc_path(const char *module_name)
{
extern HINSTANCE s_hModule;
HMODULE hmodule = NULL;
return hmodule;
}
-/*
- * Error hook function for delay load import.
- * Try to load a DLL based on psqlodbc path.
- */
-#if (_MSC_VER < 1300)
-extern PfnDliHook __pfnDliFailureHook;
-extern PfnDliHook __pfnDliNotifyHook;
-#else
-extern PfnDliHook __pfnDliFailureHook2;
-extern PfnDliHook __pfnDliNotifyHook2;
-#endif /* _MSC_VER */
static FARPROC WINAPI
DliErrorHook(unsigned dliNotify,
/* The dll names are case sensitive for the unload helper */
if (loaded_pgenlist)
{
- success = (*func)(pgenlistdll);
+ if (enlist_module == NULL)
+ {
+ success = (*func)(pgenlistdll);
+ mylog("%s unload success=%d\n", pgenlistdll, success);
+ }
+ else
+ {
+ FreeLibrary(enlist_module);
+ mylog("FreeLibrary %s\n", pgenlistdll);
+ }
loaded_pgenlist = FALSE;
- mylog("%s unload success=%d\n", pgenlistdll, success);
}
if (loaded_psqlodbc)
{
}
#endif /* _MSC_DELAY_LOAD_IMPORT */
-#if defined(_MSC_DELAY_LOAD_IMPORT)
-static int filter_env2encoding(int level)
-{
- switch (level & 0xffff)
- {
- case ERROR_MOD_NOT_FOUND:
- case ERROR_PROC_NOT_FOUND:
- return EXCEPTION_EXECUTE_HANDLER;
- }
- return EXCEPTION_CONTINUE_SEARCH;
-}
-#endif /* _MSC_DELAY_LOAD_IMPORT */
-
#ifdef _HANDLE_ENLIST_IN_DTC_
RETCODE CALL_EnlistInDtc(ConnectionClass *conn, void *pTra, int method)
{
ret = EnlistInDtc(conn, pTra, method);
}
__except ((GetExceptionCode() & 0xffff) == ERROR_MOD_NOT_FOUND ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
- loaded = FALSE;
+ if (enlist_module = MODULE_load_from_psqlodbc_path(pgenlist), NULL == enlist_module)
+ loaded = FALSE;
+ else
+ ret = EnlistInDtc(conn, pTra, method);
}
if (loaded)
loaded_pgenlist = TRUE;
ret = GetTransactionObject(hres);
}
__except ((GetExceptionCode() & 0xffff) == ERROR_MOD_NOT_FOUND ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
- loaded = FALSE;
+ if (enlist_module = MODULE_load_from_psqlodbc_path(pgenlist), NULL == enlist_module)
+ loaded = FALSE;
+ else
+ ret = GetTransactionObject(hres);
}
if (loaded)
loaded_pgenlist = TRUE;
#include "psqlodbc.h"
#include "dlg_specific.h"
+#include "loadlib.h"
HINSTANCE s_hModule; /* Saved module handle. */
-#ifdef PG_BIN
-
#include <stdio.h>
#include <string.h>
#include <sql.h>
return SQL_SUCCESS;
}
-#endif /* PG_BIN */
-static HINSTANCE s_hLModule = NULL;
+static HINSTANCE s_hLModule = NULL; /* for libpq */
static HINSTANCE s_hLModule2 = NULL;
/* This is where the Driver Manager attaches to this Driver */
}
#ifdef UNICODE_SUPPORT
-CSTR psqlodbcdll = "psqlodbc35w.dll";
+CSTR psqlodbc = "psqlodbc35w";
#else
-CSTR psqlodbcdll = "psqlodbc30a.dll";
-
+CSTR psqlodbc = "psqlodbc30a";
#endif
BOOL WINAPI
DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
char dllPath[MAX_PATH] = "";
- char *sptr;
switch (ul_reason_for_call)
{
if (message[0])
MessageBox(NULL, message, "psqlsetup", MB_OK);
}
- if (GetModuleFileName(s_hModule, dllPath, sizeof(dllPath)) <= 0)
- {
- MessageBox(NULL, "GetModuleFileName error", "psqlsetup", MB_OK);
- return TRUE;
- }
- if (sptr = strrchr(dllPath, '\\'), NULL == sptr)
- {
- MessageBox(NULL, "strrchr error", "psqlsetup", MB_OK);
- return FALSE;
- }
- strcpy_s(sptr + 1, MAX_PATH - (size_t)(sptr - dllPath), psqlodbcdll);
- if (s_hLModule2 = LoadLibraryEx(dllPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH), s_hLModule2 == NULL)
+ if (s_hLModule2 = MODULE_load_from_psqlodbc_path(psqlodbc), s_hLModule2 == NULL)
{
- MessageBox(NULL, dllPath, "psqlodbc load error", MB_OK);
+ MessageBox(NULL, "psqlodbc load error", "psqlsetup", MB_OK);
return TRUE;
}
break;
break;
case DLL_PROCESS_DETACH:
- if (NULL != s_hLModule2)
- FreeLibrary(s_hLModule2);
+ mylog("DETACHING psqlsetup\n");
+ CleanupDelayLoadedDLLs();
if (NULL != s_hLModule)
+ {
FreeLibrary(s_hLModule);
+ mylog("FreeLibrary libpq\n");
+ }
+ if (NULL != s_hLModule2)
+ {
+ FreeLibrary(s_hLModule2);
+ mylog("FreeLibrary %s\n", psqlodbc);
+ }
finalize_global_cs();
return TRUE;