From 93ed8ff7707eec179cf99f2f2f3c36f27916b068 Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Fri, 29 Jul 2005 22:27:13 +0000
Subject: [PATCH] added wxDynamicLibrary::GetSymbolAorW()

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35003 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/changes.txt            |  1 +
 docs/latex/wx/dynlib.tex    | 13 +++++++++++++
 include/wx/dynlib.h         | 24 ++++++++++++++++++++++++
 samples/console/console.cpp | 34 +++++++++++++++++++++++++++-------
 4 files changed, 65 insertions(+), 7 deletions(-)

diff --git a/docs/changes.txt b/docs/changes.txt
index 84ae5a39c2..645b134a33 100644
--- a/docs/changes.txt
+++ b/docs/changes.txt
@@ -32,6 +32,7 @@ wxMSW:
 - Position of wxEVT_MOUSEWHEEL events is now in client, not screen, coordinates.
 - Handle absence of wxListCtrl column image better (Zbigniew Zagórski)
 - Fixed asynchronous playback of large sound files in wxSound
+- Added wxDynamicLibrary::GetSymbolAorW()
 
 wxWinCE:
 
diff --git a/docs/latex/wx/dynlib.tex b/docs/latex/wx/dynlib.tex
index 5eaaa4265f..0b125a7da9 100644
--- a/docs/latex/wx/dynlib.tex
+++ b/docs/latex/wx/dynlib.tex
@@ -103,6 +103,19 @@ contains no such symbol.
 \helpref{wxDYNLIB\_FUNCTION}{wxdynlibfunction}
 
 
+\membersection{wxDynamicLibrary::GetSymbolAorW}\label{wxdynamiclibrarygetsymbolaorw}
+
+\constfunc{void *}{GetSymbolAorW}{\param{const wxString\& }{name}}
+
+This function is available only under Windows as it is only useful when
+dynamically loading symbols from standard Windows DLLs. Such functions have
+either \texttt{'A'} (in ANSI build) or \texttt{'W'} (in Unicode, or wide
+character build) suffix if they take string parameters. Using this function you
+can use just the base name of the function and the correct suffix is appende
+automatically depending on the current build. Otherwise, this method is
+identical to \helpref{GetSymbol}{wxdynamiclibrarygetsymbol}.
+
+
 \membersection{wxDynamicLibrary::GetProgramHandle}\label{wxdynamiclibrarygetprogramhandle}
 
 \func{static wxDllType}{GetProgramHandle}{\void}
diff --git a/include/wx/dynlib.h b/include/wx/dynlib.h
index a5273869fd..284ce7de2e 100644
--- a/include/wx/dynlib.h
+++ b/include/wx/dynlib.h
@@ -245,6 +245,30 @@ public:
 #endif
     }
 
+#ifdef __WXMSW__
+    // this function is useful for loading functions from the standard Windows
+    // DLLs: such functions have an 'A' (in ANSI build) or 'W' (in Unicode, or
+    // wide character build) suffix if they take string parameters
+    static void *RawGetSymbolAorW(wxDllType handle, const wxString& name)
+    {
+        return RawGetSymbol
+               (
+                handle,
+                name + 
+#if wxUSE_UNICODE
+                L'W'
+#else
+                'A'
+#endif
+               );
+    }
+
+    void *GetSymbolAorW(const wxString& name) const
+    {
+        return RawGetSymbolAorW(m_handle, name);
+    }
+#endif // __WXMSW__
+
     // return all modules/shared libraries in the address space of this process
     //
     // returns an empty array if not implemented or an error occurred
diff --git a/samples/console/console.cpp b/samples/console/console.cpp
index 687c903bbd..65eacb7459 100644
--- a/samples/console/console.cpp
+++ b/samples/console/console.cpp
@@ -53,7 +53,7 @@
     #define TEST_CMDLINE
     #define TEST_DATETIME
     #define TEST_DIR
-    #define TEST_DLLLOADER
+    #define TEST_DYNLIB
     #define TEST_ENVIRON
     #define TEST_EXECUTE
     #define TEST_FILE
@@ -85,7 +85,7 @@
     #define TEST_WCHAR
     #define TEST_ZIP
 #else // #if TEST_ALL
-    #define TEST_STACKWALKER
+    #define TEST_DYNLIB
 #endif
 
 // some tests are interactive, define this to run them
@@ -372,7 +372,7 @@ static void TestDirExists()
 // wxDllLoader
 // ----------------------------------------------------------------------------
 
-#ifdef TEST_DLLLOADER
+#ifdef TEST_DYNLIB
 
 #include "wx/dynlib.h"
 
@@ -398,7 +398,7 @@ static void TestDllLoad()
     }
     else
     {
-        typedef int (*wxStrlenType)(const char *);
+        typedef int (wxSTDCALL *wxStrlenType)(const char *);
         wxStrlenType pfnStrlen = (wxStrlenType)lib.GetSymbol(FUNC_NAME);
         if ( !pfnStrlen )
         {
@@ -419,6 +419,26 @@ static void TestDllLoad()
                 wxPuts(_T("... ok"));
             }
         }
+
+#ifdef __WXMSW__
+        static const wxChar *FUNC_NAME_AW = _T("lstrlen");
+
+        typedef int (wxSTDCALL *wxStrlenTypeAorW)(const wxChar *);
+        wxStrlenTypeAorW
+            pfnStrlenAorW = (wxStrlenTypeAorW)lib.GetSymbolAorW(FUNC_NAME_AW);
+        if ( !pfnStrlenAorW )
+        {
+            wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
+                     FUNC_NAME_AW, LIB_NAME);
+        }
+        else
+        {
+            if ( pfnStrlenAorW(_T("foobar")) != 6 )
+            {
+                wxPrintf(_T("ERROR: loaded function is not wxStrlen()!\n"));
+            }
+        }
+#endif // __WXMSW__
     }
 }
 
@@ -450,7 +470,7 @@ static void TestDllListLoaded()
 
 #endif
 
-#endif // TEST_DLLLOADER
+#endif // TEST_DYNLIB
 
 // ----------------------------------------------------------------------------
 // wxGet/SetEnv
@@ -4119,10 +4139,10 @@ int main(int argc, char **argv)
     TestDirTraverse();
 #endif // TEST_DIR
 
-#ifdef TEST_DLLLOADER
+#ifdef TEST_DYNLIB
     TestDllLoad();
     TestDllListLoaded();
-#endif // TEST_DLLLOADER
+#endif // TEST_DYNLIB
 
 #ifdef TEST_ENVIRON
     TestEnvironment();
-- 
2.50.0

