X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gmodule%2Fgmodule-win32.c;h=2a35b1920e04d8075866c5126f427892b5911847;hb=2e5bd8cf47f9e1559ccc44823a2f321b8ff8c1ea;hp=6bcef9ff14e83ee7e37264dc6b1898406e994d85;hpb=28bd47860b8129d76699d11796928fa148541036;p=platform%2Fupstream%2Fglib.git diff --git a/gmodule/gmodule-win32.c b/gmodule/gmodule-win32.c index 6bcef9f..2a35b19 100644 --- a/gmodule/gmodule-win32.c +++ b/gmodule/gmodule-win32.c @@ -5,23 +5,21 @@ * Copyright (C) 1998 Tor Lillqvist * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public + * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. + * Lesser General Public License for more details. * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . */ /* - * Modified by the GLib Team and others 1997-1999. See the AUTHORS + * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. @@ -30,31 +28,61 @@ /* * MT safe */ +#include "config.h" #include #include -#include + #include +#ifdef G_WITH_CYGWIN +#include +#endif + static void -set_error (void) +set_error (const gchar *format, + ...) { - gchar *error = g_win32_error_message (GetLastError ()); + gchar *error; + gchar *detail; + gchar *message; + va_list args; + + error = g_win32_error_message (GetLastError ()); - g_module_set_error (error); + va_start (args, format); + detail = g_strdup_vprintf (format, args); + va_end (args); + + message = g_strconcat (detail, error, NULL); + + g_module_set_error (message); + g_free (message); + g_free (detail); g_free (error); } /* --- functions --- */ static gpointer _g_module_open (const gchar *file_name, - gboolean bind_lazy) + gboolean bind_lazy, + gboolean bind_local) { HINSTANCE handle; - - handle = LoadLibrary (file_name); + wchar_t *wfilename; +#ifdef G_WITH_CYGWIN + gchar tmp[MAX_PATH]; + + cygwin_conv_to_win32_path(file_name, tmp); + file_name = tmp; +#endif + wfilename = g_utf8_to_utf16 (file_name, -1, NULL, NULL, NULL); + + handle = LoadLibraryW (wfilename); + g_free (wfilename); + if (!handle) - set_error (); + set_error ("'%s': ", file_name); return handle; } @@ -74,51 +102,28 @@ _g_module_close (gpointer handle, { if (handle != null_module_handle) if (!FreeLibrary (handle)) - set_error (); + set_error (""); } static gpointer find_in_any_module_using_toolhelp (const gchar *symbol_name) { - typedef HANDLE (WINAPI *PFNCREATETOOLHELP32SNAPSHOT)(DWORD, DWORD); - static PFNCREATETOOLHELP32SNAPSHOT pfnCreateToolhelp32Snapshot = NULL; - - typedef BOOL (WINAPI *PFNMODULE32FIRST)(HANDLE, LPMODULEENTRY32); - static PFNMODULE32FIRST pfnModule32First= NULL; - - typedef BOOL (WINAPI *PFNMODULE32NEXT)(HANDLE, LPMODULEENTRY32); - static PFNMODULE32NEXT pfnModule32Next = NULL; - - static HMODULE kernel32; - HANDLE snapshot; MODULEENTRY32 me32; gpointer p; - if (!pfnCreateToolhelp32Snapshot || !pfnModule32First || !pfnModule32Next) - { - if (!kernel32) - if (!(kernel32 = GetModuleHandle ("kernel32.dll"))) - return NULL; - - if (!(pfnCreateToolhelp32Snapshot = (PFNCREATETOOLHELP32SNAPSHOT) GetProcAddress (kernel32, "CreateToolhelp32Snapshot")) - || !(pfnModule32First = (PFNMODULE32FIRST) GetProcAddress (kernel32, "Module32First")) - || !(pfnModule32Next = (PFNMODULE32NEXT) GetProcAddress (kernel32, "Module32Next"))) - return NULL; - } - - if ((snapshot = (*pfnCreateToolhelp32Snapshot) (TH32CS_SNAPMODULE, 0)) == (HANDLE) -1) + if ((snapshot = CreateToolhelp32Snapshot (TH32CS_SNAPMODULE, 0)) == (HANDLE) -1) return NULL; me32.dwSize = sizeof (me32); p = NULL; - if ((*pfnModule32First) (snapshot, &me32)) + if (Module32First (snapshot, &me32)) { do { if ((p = GetProcAddress (me32.hModule, symbol_name)) != NULL) break; - } while ((*pfnModule32Next) (snapshot, &me32)); + } while (Module32Next (snapshot, &me32)); } CloseHandle (snapshot); @@ -127,62 +132,11 @@ find_in_any_module_using_toolhelp (const gchar *symbol_name) } static gpointer -find_in_any_module_using_psapi (const gchar *symbol_name) -{ - static HMODULE psapi = NULL; - - typedef BOOL (WINAPI *PFNENUMPROCESSMODULES) (HANDLE, HMODULE *, DWORD, LPDWORD) ; - static PFNENUMPROCESSMODULES pfnEnumProcessModules = NULL; - - HMODULE *modules; - HMODULE dummy; - gint i, size; - DWORD needed; - - gpointer p; - - if (!pfnEnumProcessModules) - { - if (!psapi) - if ((psapi = LoadLibrary ("psapi.dll")) == NULL) - return NULL; - - if (!(pfnEnumProcessModules = (PFNENUMPROCESSMODULES) GetProcAddress (psapi, "EnumProcessModules"))) - return NULL; - } - - if (!(*pfnEnumProcessModules) (GetCurrentProcess (), &dummy, - sizeof (HMODULE), &needed)) - return NULL; - - size = needed + 10 * sizeof (HMODULE); - modules = g_malloc (size); - - if (!(*pfnEnumProcessModules) (GetCurrentProcess (), modules, - size, &needed) - || needed > size) - { - g_free (modules); - return NULL; - } - - p = NULL; - for (i = 0; i < needed / sizeof (HMODULE); i++) - if ((p = GetProcAddress (modules[i], symbol_name)) != NULL) - break; - - g_free (modules); - - return p; -} - -static gpointer find_in_any_module (const gchar *symbol_name) { gpointer result; - if ((result = find_in_any_module_using_toolhelp (symbol_name)) == NULL - && (result = find_in_any_module_using_psapi (symbol_name)) == NULL) + if ((result = find_in_any_module_using_toolhelp (symbol_name)) == NULL) return NULL; else return result; @@ -195,12 +149,15 @@ _g_module_symbol (gpointer handle, gpointer p; if (handle == null_module_handle) - p = find_in_any_module (symbol_name); + { + if ((p = GetProcAddress (GetModuleHandle (NULL), symbol_name)) == NULL) + p = find_in_any_module (symbol_name); + } else p = GetProcAddress (handle, symbol_name); if (!p) - set_error (); + set_error (""); return p; } @@ -210,15 +167,34 @@ _g_module_build_path (const gchar *directory, const gchar *module_name) { gint k; - + k = strlen (module_name); + if (directory && *directory) - if (k > 4 && g_strcasecmp (module_name + k - 4, ".dll") == 0) - return g_strconcat (directory, "\\", module_name, NULL); + if (k > 4 && g_ascii_strcasecmp (module_name + k - 4, ".dll") == 0) + return g_strconcat (directory, G_DIR_SEPARATOR_S, module_name, NULL); +#ifdef G_WITH_CYGWIN + else if (strncmp (module_name, "lib", 3) == 0 || strncmp (module_name, "cyg", 3) == 0) + return g_strconcat (directory, G_DIR_SEPARATOR_S, module_name, ".dll", NULL); + else + return g_strconcat (directory, G_DIR_SEPARATOR_S, "cyg", module_name, ".dll", NULL); +#else + else if (strncmp (module_name, "lib", 3) == 0) + return g_strconcat (directory, G_DIR_SEPARATOR_S, module_name, ".dll", NULL); else - return g_strconcat (directory, "\\", module_name, ".dll", NULL); - else if (k > 4 && g_strcasecmp (module_name + k - 4, ".dll") == 0) + return g_strconcat (directory, G_DIR_SEPARATOR_S, "lib", module_name, ".dll", NULL); +#endif + else if (k > 4 && g_ascii_strcasecmp (module_name + k - 4, ".dll") == 0) return g_strdup (module_name); +#ifdef G_WITH_CYGWIN + else if (strncmp (module_name, "lib", 3) == 0 || strncmp (module_name, "cyg", 3) == 0) + return g_strconcat (module_name, ".dll", NULL); else + return g_strconcat ("cyg", module_name, ".dll", NULL); +#else + else if (strncmp (module_name, "lib", 3) == 0) return g_strconcat (module_name, ".dll", NULL); + else + return g_strconcat ("lib", module_name, ".dll", NULL); +#endif }