]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/utils.cpp
Unicode fixes. Appears that this may be the last before wxMSW will link
[wxWidgets.git] / src / msw / utils.cpp
index 86a4b1ea9e65fbf670517244981db9f2ed1bbedb..574c346ba7e11f4233991d99a7fca3c3ffbebcf4 100644 (file)
 
 #include "wx/msw/private.h"
 #include "wx/timer.h"
 
 #include "wx/msw/private.h"
 #include "wx/timer.h"
+#include "wx/intl.h"
+
+#include <windows.h>
 
 #include <ctype.h>
 
 
 #include <ctype.h>
 
-#ifndef __GNUWIN32__
+#if !defined(__GNUWIN32__) && !defined(__WXWINE__) && !defined(__SALFORDC__)
 #include <direct.h>
 #include <direct.h>
+
+#ifndef __MWERKS__
 #include <dos.h>
 #include <dos.h>
+#endif
 #endif  //GNUWIN32
 
 #endif  //GNUWIN32
 
-#ifdef __GNUWIN32__
+#if defined(__GNUWIN32__) && !defined(__TWIN32__)
 #include <sys/unistd.h>
 #include <sys/stat.h>
 #endif  //GNUWIN32
 #include <sys/unistd.h>
 #include <sys/stat.h>
 #endif  //GNUWIN32
@@ -50,7 +56,7 @@
 #include <dir.h>
 #endif
 
 #include <dir.h>
 #endif
 
-#ifdef __WIN32__
+#if defined(__WIN32__) && !defined(__WXWINE__)
 #include <io.h>
 
 #ifndef __GNUWIN32__
 #include <io.h>
 
 #ifndef __GNUWIN32__
 #include <stdlib.h>
 #include <string.h>
 #ifndef __WATCOMC__
 #include <stdlib.h>
 #include <string.h>
 #ifndef __WATCOMC__
-#if !(defined(_MSC_VER) && (_MSC_VER > 800))
-#include <errno.h>
-#endif
+    #if !(defined(_MSC_VER) && (_MSC_VER > 800))
+        #include <errno.h>
+    #endif
 #endif
 #include <stdarg.h>
 
 #endif
 #include <stdarg.h>
 
+//// BEGIN for console support: VC++ only
+#ifdef __VISUALC__
+
+#include "wx/msw/msvcrt.h"
+
+#include <fcntl.h>
+
+#include "wx/ioswrap.h"
+
+#if wxUSE_IOSTREAMH
+// N.B. BC++ doesn't have istream.h, ostream.h
+#  include <io.h>
+#  include <fstream.h>
+#else
+#  include <fstream>
+#endif
+
+/* Need to undef new if including crtdbg.h */
+#  ifdef new
+#  undef new
+#  endif
+
+#ifndef __WIN16__
+#  include <crtdbg.h>
+#endif
+
+#  if defined(__WXDEBUG__) && wxUSE_GLOBAL_MEMORY_OPERATORS && wxUSE_DEBUG_NEW_ALWAYS
+#  define new new(__FILE__,__LINE__)
+#  endif
+
+#endif
+  // __VISUALC__
+/// END for console support
+
 // In the WIN.INI file
 // In the WIN.INI file
-static const char WX_SECTION[] = "wxWindows";
-static const char eHOSTNAME[]  = "HostName";
-static const char eUSERID[]    = "UserId";
-static const char eUSERNAME[]  = "UserName";
+static const wxChar WX_SECTION[] = _T("wxWindows");
+static const wxChar eHOSTNAME[]  = _T("HostName");
+static const wxChar eUSERID[]    = _T("UserId");
+static const wxChar eUSERNAME[]  = _T("UserName");
 
 // For the following functions we SHOULD fill in support
 // for Windows-NT (which I don't know) as I assume it begin
 
 // For the following functions we SHOULD fill in support
 // for Windows-NT (which I don't know) as I assume it begin
@@ -80,28 +120,31 @@ static const char eUSERNAME[]  = "UserName";
 // functions beyond those provided by WinSock
 
 // Get full hostname (eg. DoDo.BSn-Germany.crg.de)
 // functions beyond those provided by WinSock
 
 // Get full hostname (eg. DoDo.BSn-Germany.crg.de)
-bool wxGetHostName(char *buf, int maxSize)
+bool wxGetHostName(wxChar *buf, int maxSize)
 {
 {
-#ifdef __WIN32__
+#if defined(__WIN32__) && !defined(__TWIN32__)
   DWORD nSize = maxSize;
   return (::GetComputerName(buf, &nSize) != 0);
 #else
   DWORD nSize = maxSize;
   return (::GetComputerName(buf, &nSize) != 0);
 #else
-  char *sysname;
-  const char *default_host = "noname";
+  wxChar *sysname;
+  const wxChar *default_host = _T("noname");
 
 
-  if ((sysname = getenv("SYSTEM_NAME")) == NULL) {
+  if ((sysname = wxGetenv(_T("SYSTEM_NAME"))) == NULL) {
      GetProfileString(WX_SECTION, eHOSTNAME, default_host, buf, maxSize - 1);
   } else
      GetProfileString(WX_SECTION, eHOSTNAME, default_host, buf, maxSize - 1);
   } else
-    strncpy(buf, sysname, maxSize - 1);
-  buf[maxSize] = '\0';
+    wxStrncpy(buf, sysname, maxSize - 1);
+  buf[maxSize] = _T('\0');
   return *buf ? TRUE : FALSE;
 #endif
 }
 
 // Get user ID e.g. jacs
   return *buf ? TRUE : FALSE;
 #endif
 }
 
 // Get user ID e.g. jacs
-bool wxGetUserId(char *buf, int maxSize)
+bool wxGetUserId(wxChar *buf, int maxSize)
 {
 {
-#if defined(__WIN32__) && !defined(__win32s__) && 0
+#if defined(__WIN32__) && !defined(__win32s__) && !defined(__TWIN32__)
+
+    // VZ: why should it be so complicated??
+#if 0
   // Gets the current user's full name according to the MS article PSS ID
   // Number: Q119670
   // Seems to be the same as the login name for me?
   // Gets the current user's full name according to the MS article PSS ID
   // Number: Q119670
   // Seems to be the same as the login name for me?
@@ -114,12 +157,12 @@ bool wxGetUserId(char *buf, int maxSize)
   WCHAR  wszUserName[256];           // Unicode user name
   WCHAR  wszDomain[256];
   LPBYTE ComputerName;
   WCHAR  wszUserName[256];           // Unicode user name
   WCHAR  wszDomain[256];
   LPBYTE ComputerName;
+
   struct _SERVER_INFO_100 *si100;   // Server structure
   struct _USER_INFO_2 *ui;          // User structure
   struct _SERVER_INFO_100 *si100;   // Server structure
   struct _USER_INFO_2 *ui;          // User structure
+
   // Convert ASCII user name and domain to Unicode.
   // Convert ASCII user name and domain to Unicode.
+
   MultiByteToWideChar( CP_ACP, 0, UserName,
      strlen(UserName)+1, wszUserName, sizeof(wszUserName) );
   MultiByteToWideChar( CP_ACP, 0, Domain,
   MultiByteToWideChar( CP_ACP, 0, UserName,
      strlen(UserName)+1, wszUserName, sizeof(wszUserName) );
   MultiByteToWideChar( CP_ACP, 0, Domain,
@@ -127,63 +170,56 @@ bool wxGetUserId(char *buf, int maxSize)
 
   // Get the computer name of a DC for the specified domain.
   // >If you get a link error on this, include netapi32.lib<
 
   // Get the computer name of a DC for the specified domain.
   // >If you get a link error on this, include netapi32.lib<
+
   NetGetDCName( NULL, wszDomain, &ComputerName );
   NetGetDCName( NULL, wszDomain, &ComputerName );
+
   // Look up the user on the DC.
   // Look up the user on the DC.
+
   if(NetUserGetInfo( (LPWSTR) ComputerName,
      (LPWSTR) &wszUserName, 2, (LPBYTE *) &ui))
   {
      printf( "Error getting user information.\n" );
      return( FALSE );
   }
   if(NetUserGetInfo( (LPWSTR) ComputerName,
      (LPWSTR) &wszUserName, 2, (LPBYTE *) &ui))
   {
      printf( "Error getting user information.\n" );
      return( FALSE );
   }
+
   // Convert the Unicode full name to ASCII.
   // Convert the Unicode full name to ASCII.
+
   WideCharToMultiByte( CP_ACP, 0, ui->usri2_full_name,
      -1, buf, 256, NULL, NULL );
   }
   return( TRUE );
   WideCharToMultiByte( CP_ACP, 0, ui->usri2_full_name,
      -1, buf, 256, NULL, NULL );
   }
   return( TRUE );
-/*
-  DWORD nSize = maxSize;
-  return ::GetUserName(buf, &nSize);
-*/
-#else
-  char *user;
-  const char *default_id = "anonymous";
+#else   // 1
+    DWORD nSize = maxSize;
+    if ( ::GetUserName(buf, &nSize) == 0 )
+    {
+        wxLogSysError(_T("Can not get user name"));
+
+        return FALSE;
+    }
+
+    return TRUE;
+#endif  // 0/1
+
+#else   // Win16 or Win32s
+  wxChar *user;
+  const wxChar *default_id = _T("anonymous");
 
   // Can't assume we have NIS (PC-NFS) or some other ID daemon
   // So we ...
 
   // Can't assume we have NIS (PC-NFS) or some other ID daemon
   // So we ...
-  if (  (user = getenv("USER")) == NULL &&
-  (user = getenv("LOGNAME")) == NULL ) {
+  if (  (user = wxGetenv(_T("USER"))) == NULL &&
+  (user = wxGetenv(_T("LOGNAME"))) == NULL ) {
      // Use wxWindows configuration data (comming soon)
      GetProfileString(WX_SECTION, eUSERID, default_id, buf, maxSize - 1);
   } else
      // Use wxWindows configuration data (comming soon)
      GetProfileString(WX_SECTION, eUSERID, default_id, buf, maxSize - 1);
   } else
-    strncpy(buf, user, maxSize - 1);
+    wxStrncpy(buf, user, maxSize - 1);
   return *buf ? TRUE : FALSE;
 #endif
 }
 
 // Get user name e.g. Julian Smart
   return *buf ? TRUE : FALSE;
 #endif
 }
 
 // Get user name e.g. Julian Smart
-bool wxGetUserName(char *buf, int maxSize)
+bool wxGetUserName(wxChar *buf, int maxSize)
 {
 {
-  const char *default_name = "Unknown User"; 
-#if defined(__WIN32__)
-/*
-  DWORD nSize = maxSize;
-  In VC++ 4.0, results in unresolved symbol __imp__GetUserNameA
-  if (GetUserName(buf, &nSize))
-    return TRUE;
-  else
-*/
-    // Could use NIS, MS-Mail or other site specific programs
-    // Use wxWindows configuration data 
-    GetProfileString(WX_SECTION, eUSERNAME, default_name, buf, maxSize - 1);
-    return *buf ? TRUE : FALSE;
-//  }
-#else
-#if !defined(__WATCOMC__) && !defined(__GNUWIN32__) && wxUSE_PENWINDOWS
+#if wxUSE_PENWINDOWS && !defined(__WATCOMC__) && !defined(__GNUWIN32__)
   extern HANDLE g_hPenWin; // PenWindows Running?
   if (g_hPenWin)
   {
   extern HANDLE g_hPenWin; // PenWindows Running?
   if (g_hPenWin)
   {
@@ -196,11 +232,20 @@ bool wxGetUserName(char *buf, int maxSize)
 #endif
   {
     // Could use NIS, MS-Mail or other site specific programs
 #endif
   {
     // Could use NIS, MS-Mail or other site specific programs
-    // Use wxWindows configuration data 
-    GetProfileString(WX_SECTION, eUSERNAME, default_name, buf, maxSize - 1);
+    // Use wxWindows configuration data
+    bool ok = GetProfileString(WX_SECTION, eUSERNAME, _T(""), buf, maxSize - 1) != 0;
+    if ( !ok )
+    {
+        ok = wxGetUserId(buf, maxSize);
+    }
+
+    if ( !ok )
+    {
+        wxStrncpy(buf, _T("Unknown User"), maxSize);
+    }
   }
   }
-  return *buf ? TRUE : FALSE;
-#endif
+
+  return TRUE;
 }
 
 int wxKill(long pid, int sig)
 }
 
 int wxKill(long pid, int sig)
@@ -214,23 +259,23 @@ int wxKill(long pid, int sig)
 bool
 wxShell(const wxString& command)
 {
 bool
 wxShell(const wxString& command)
 {
-  char *shell;
-  if ((shell = getenv("COMSPEC")) == NULL)
-    shell = "\\COMMAND.COM";
+  wxChar *shell;
+  if ((shell = wxGetenv(_T("COMSPEC"))) == NULL)
+    shell = _T("\\COMMAND.COM");
 
 
-  char tmp[255];
-  if (command != "")
-    sprintf(tmp, "%s /c %s", shell, WXSTRINGCAST command);
+  wxChar tmp[255];
+  if (command != _T(""))
+    wxSprintf(tmp, _T("%s /c %s"), shell, WXSTRINGCAST command);
   else
   else
-    strcpy(tmp, shell);
+    wxStrcpy(tmp, shell);
 
 
-  return (wxExecute((char *)tmp, FALSE) != 0);
+  return (wxExecute((wxChar *)tmp, FALSE) != 0);
 }
 
 // Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX)
 }
 
 // Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX)
-long wxGetFreeMemory(void)
+long wxGetFreeMemory()
 {
 {
-#if defined(__WIN32__) && !defined(__BORLANDC__)
+#if defined(__WIN32__) && !defined(__BORLANDC__) && !defined(__TWIN32__)
   MEMORYSTATUS memStatus;
   memStatus.dwLength = sizeof(MEMORYSTATUS);
   GlobalMemoryStatus(&memStatus);
   MEMORYSTATUS memStatus;
   memStatus.dwLength = sizeof(MEMORYSTATUS);
   GlobalMemoryStatus(&memStatus);
@@ -245,7 +290,7 @@ static bool inTimer = FALSE;
 class wxSleepTimer: public wxTimer
 {
  public:
 class wxSleepTimer: public wxTimer
 {
  public:
-  inline void Notify(void)
+  inline void Notify()
   {
     inTimer = FALSE;
     Stop();
   {
     inTimer = FALSE;
     Stop();
@@ -254,6 +299,27 @@ class wxSleepTimer: public wxTimer
 
 static wxTimer *wxTheSleepTimer = NULL;
 
 
 static wxTimer *wxTheSleepTimer = NULL;
 
+void wxUsleep(unsigned long milliseconds)
+{
+#ifdef __WIN32__
+    ::Sleep(milliseconds);
+#else
+  if (inTimer)
+    return;
+
+  wxTheSleepTimer = new wxSleepTimer;
+  inTimer = TRUE;
+  wxTheSleepTimer->Start(milliseconds);
+  while (inTimer)
+  {
+    if (wxTheApp->Pending())
+      wxTheApp->Dispatch();
+  }
+  delete wxTheSleepTimer;
+  wxTheSleepTimer = NULL;
+#endif
+}
+
 void wxSleep(int nSecs)
 {
 #if 0 // WIN32 hangs app
 void wxSleep(int nSecs)
 {
 #if 0 // WIN32 hangs app
@@ -276,16 +342,16 @@ void wxSleep(int nSecs)
 }
 
 // Consume all events until no more left
 }
 
 // Consume all events until no more left
-void wxFlushEvents(void)
+void wxFlushEvents()
 {
 //  wxYield();
 }
 
 // Output a debug mess., in a system dependent fashion.
 {
 //  wxYield();
 }
 
 // Output a debug mess., in a system dependent fashion.
-void wxDebugMsg(const char *fmt ...)
+void wxDebugMsg(const wxChar *fmt ...)
 {
   va_list ap;
 {
   va_list ap;
-  static char buffer[512];
+  static wxChar buffer[512];
 
   if (!wxTheApp->GetWantDebugOutput())
     return ;
 
   if (!wxTheApp->GetWantDebugOutput())
     return ;
@@ -293,7 +359,7 @@ void wxDebugMsg(const char *fmt ...)
   va_start(ap, fmt);
 
   wvsprintf(buffer,fmt,ap) ;
   va_start(ap, fmt);
 
   wvsprintf(buffer,fmt,ap) ;
-  OutputDebugString((LPCSTR)buffer) ;
+  OutputDebugString((LPCTSTR)buffer) ;
 
   va_end(ap);
 }
 
   va_end(ap);
 }
@@ -301,8 +367,8 @@ void wxDebugMsg(const char *fmt ...)
 // Non-fatal error: pop up message box and (possibly) continue
 void wxError(const wxString& msg, const wxString& title)
 {
 // Non-fatal error: pop up message box and (possibly) continue
 void wxError(const wxString& msg, const wxString& title)
 {
-  sprintf(wxBuffer, "%s\nContinue?", WXSTRINGCAST msg);
-  if (MessageBox(NULL, (LPCSTR)wxBuffer, (LPCSTR)WXSTRINGCAST title,
+  wxSprintf(wxBuffer, _T("%s\nContinue?"), WXSTRINGCAST msg);
+  if (MessageBox(NULL, (LPCTSTR)wxBuffer, (LPCTSTR)WXSTRINGCAST title,
              MB_ICONSTOP | MB_YESNO) == IDNO)
     wxExit();
 }
              MB_ICONSTOP | MB_YESNO) == IDNO)
     wxExit();
 }
@@ -310,18 +376,20 @@ void wxError(const wxString& msg, const wxString& title)
 // Fatal error: pop up message box and abort
 void wxFatalError(const wxString& msg, const wxString& title)
 {
 // Fatal error: pop up message box and abort
 void wxFatalError(const wxString& msg, const wxString& title)
 {
-  sprintf(wxBuffer, "%s: %s", WXSTRINGCAST title, WXSTRINGCAST msg);
-  FatalAppExit(0, (LPCSTR)wxBuffer);
+  wxSprintf(wxBuffer, _T("%s: %s"), WXSTRINGCAST title, WXSTRINGCAST msg);
+  FatalAppExit(0, (LPCTSTR)wxBuffer);
 }
 
 // Emit a beeeeeep
 }
 
 // Emit a beeeeeep
-void wxBell(void)
+void wxBell()
 {
 {
-#ifdef __WIN32__
-  Beep(1000,1000) ; // 1kHz during 1 sec.
-#else
-  MessageBeep(-1) ;
-#endif
+    // Removed by RD because IHMO syncronous sound is a Bad Thing.  MessageBeep
+    // will do a similar thing anyway if there is no sound card...
+//#ifdef __WIN32__
+//  Beep(1000,1000) ; // 1kHz during 1 sec.
+//#else
+  MessageBeep((UINT)-1) ;
+//#endif
 }
 
 // Chris Breeze 27/5/98: revised WIN32 code to
 }
 
 // Chris Breeze 27/5/98: revised WIN32 code to
@@ -332,7 +400,7 @@ int wxGetOsVersion(int *majorVsn, int *minorVsn)
   if (majorVsn) *majorVsn = 0;
   if (minorVsn) *minorVsn = 0;
 
   if (majorVsn) *majorVsn = 0;
   if (minorVsn) *minorVsn = 0;
 
-#ifdef WIN32
+#if defined(__WIN32__) && !defined(__SC__)
   OSVERSIONINFO info;
   memset(&info, 0, sizeof(OSVERSIONINFO));
   info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
   OSVERSIONINFO info;
   memset(&info, 0, sizeof(OSVERSIONINFO));
   info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
@@ -356,7 +424,7 @@ int wxGetOsVersion(int *majorVsn, int *minorVsn)
   return wxWINDOWS; // error if we get here, return generic value
 #else
   // Win16 code...
   return wxWINDOWS; // error if we get here, return generic value
 #else
   // Win16 code...
-  int retValue ;
+  int retValue = 0;
 #  ifdef __WINDOWS_386__
   retValue = wxWIN386;
 #  else
 #  ifdef __WINDOWS_386__
   retValue = wxWIN386;
 #  else
@@ -376,48 +444,48 @@ int wxGetOsVersion(int *majorVsn, int *minorVsn)
 #if wxUSE_RESOURCES
 bool wxWriteResource(const wxString& section, const wxString& entry, const wxString& value, const wxString& file)
 {
 #if wxUSE_RESOURCES
 bool wxWriteResource(const wxString& section, const wxString& entry, const wxString& value, const wxString& file)
 {
-  if (file != "")
-    return (WritePrivateProfileString((LPCSTR)WXSTRINGCAST section, (LPCSTR)WXSTRINGCAST entry, (LPCSTR)value, (LPCSTR)WXSTRINGCAST file) != 0);
+  if (file != _T(""))
+    return (WritePrivateProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)value, (LPCTSTR)WXSTRINGCAST file) != 0);
   else
   else
-    return (WriteProfileString((LPCSTR)WXSTRINGCAST section, (LPCSTR)WXSTRINGCAST entry, (LPCSTR)WXSTRINGCAST value) != 0);
+    return (WriteProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)WXSTRINGCAST value) != 0);
 }
 
 bool wxWriteResource(const wxString& section, const wxString& entry, float value, const wxString& file)
 {
 }
 
 bool wxWriteResource(const wxString& section, const wxString& entry, float value, const wxString& file)
 {
-  char buf[50];
-  sprintf(buf, "%.4f", value);
+  wxChar buf[50];
+  wxSprintf(buf, _T("%.4f"), value);
   return wxWriteResource(section, entry, buf, file);
 }
 
 bool wxWriteResource(const wxString& section, const wxString& entry, long value, const wxString& file)
 {
   return wxWriteResource(section, entry, buf, file);
 }
 
 bool wxWriteResource(const wxString& section, const wxString& entry, long value, const wxString& file)
 {
-  char buf[50];
-  sprintf(buf, "%ld", value);
+  wxChar buf[50];
+  wxSprintf(buf, _T("%ld"), value);
   return wxWriteResource(section, entry, buf, file);
 }
 
 bool wxWriteResource(const wxString& section, const wxString& entry, int value, const wxString& file)
 {
   return wxWriteResource(section, entry, buf, file);
 }
 
 bool wxWriteResource(const wxString& section, const wxString& entry, int value, const wxString& file)
 {
-  char buf[50];
-  sprintf(buf, "%d", value);
+  wxChar buf[50];
+  wxSprintf(buf, _T("%d"), value);
   return wxWriteResource(section, entry, buf, file);
 }
 
   return wxWriteResource(section, entry, buf, file);
 }
 
-bool wxGetResource(const wxString& section, const wxString& entry, char **value, const wxString& file)
+bool wxGetResource(const wxString& section, const wxString& entry, wxChar **value, const wxString& file)
 {
 {
-  static const char defunkt[] = "$$default";
-  if (file != "")
+  static const wxChar defunkt[] = _T("$$default");
+  if (file != _T(""))
   {
   {
-    int n = GetPrivateProfileString((LPCSTR)WXSTRINGCAST section, (LPCSTR)WXSTRINGCAST entry, (LPCSTR)defunkt,
-                                    (LPSTR)wxBuffer, 1000, (LPCSTR)WXSTRINGCAST file);
-    if (n == 0 || strcmp(wxBuffer, defunkt) == 0)
+    int n = GetPrivateProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)defunkt,
+                                    (LPTSTR)wxBuffer, 1000, (LPCTSTR)WXSTRINGCAST file);
+    if (n == 0 || wxStrcmp(wxBuffer, defunkt) == 0)
      return FALSE;
   }
   else
   {
      return FALSE;
   }
   else
   {
-    int n = GetProfileString((LPCSTR)WXSTRINGCAST section, (LPCSTR)WXSTRINGCAST entry, (LPCSTR)defunkt,
-                                    (LPSTR)wxBuffer, 1000);
-    if (n == 0 || strcmp(wxBuffer, defunkt) == 0)
+    int n = GetProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)defunkt,
+                                    (LPTSTR)wxBuffer, 1000);
+    if (n == 0 || wxStrcmp(wxBuffer, defunkt) == 0)
       return FALSE;
   }
   if (*value) delete[] (*value);
       return FALSE;
   }
   if (*value) delete[] (*value);
@@ -427,11 +495,11 @@ bool wxGetResource(const wxString& section, const wxString& entry, char **value,
 
 bool wxGetResource(const wxString& section, const wxString& entry, float *value, const wxString& file)
 {
 
 bool wxGetResource(const wxString& section, const wxString& entry, float *value, const wxString& file)
 {
-  char *s = NULL;
-  bool succ = wxGetResource(section, entry, (char **)&s, file);
+  wxChar *s = NULL;
+  bool succ = wxGetResource(section, entry, (wxChar **)&s, file);
   if (succ)
   {
   if (succ)
   {
-    *value = (float)strtod(s, NULL);
+    *value = (float)wxStrtod(s, NULL);
     delete[] s;
     return TRUE;
   }
     delete[] s;
     return TRUE;
   }
@@ -440,11 +508,11 @@ bool wxGetResource(const wxString& section, const wxString& entry, float *value,
 
 bool wxGetResource(const wxString& section, const wxString& entry, long *value, const wxString& file)
 {
 
 bool wxGetResource(const wxString& section, const wxString& entry, long *value, const wxString& file)
 {
-  char *s = NULL;
-  bool succ = wxGetResource(section, entry, (char **)&s, file);
+  wxChar *s = NULL;
+  bool succ = wxGetResource(section, entry, (wxChar **)&s, file);
   if (succ)
   {
   if (succ)
   {
-    *value = strtol(s, NULL, 10);
+    *value = wxStrtol(s, NULL, 10);
     delete[] s;
     return TRUE;
   }
     delete[] s;
     return TRUE;
   }
@@ -453,79 +521,81 @@ bool wxGetResource(const wxString& section, const wxString& entry, long *value,
 
 bool wxGetResource(const wxString& section, const wxString& entry, int *value, const wxString& file)
 {
 
 bool wxGetResource(const wxString& section, const wxString& entry, int *value, const wxString& file)
 {
-  char *s = NULL;
-  bool succ = wxGetResource(section, entry, (char **)&s, file);
+  wxChar *s = NULL;
+  bool succ = wxGetResource(section, entry, (wxChar **)&s, file);
   if (succ)
   {
   if (succ)
   {
-    *value = (int)strtol(s, NULL, 10);
-    delete[] s; 
+    *value = (int)wxStrtol(s, NULL, 10);
+    delete[] s;
     return TRUE;
   }
   else return FALSE;
 }
 #endif // wxUSE_RESOURCES
 
     return TRUE;
   }
   else return FALSE;
 }
 #endif // wxUSE_RESOURCES
 
-// Old cursor
-static HCURSOR wxBusyCursorOld = 0;
-static int wxBusyCursorCount = 0;
+// ---------------------------------------------------------------------------
+// helper functions for showing a "busy" cursor
+// ---------------------------------------------------------------------------
+
+HCURSOR gs_wxBusyCursor = 0;     // new, busy cursor
+HCURSOR gs_wxBusyCursorOld = 0;  // old cursor
+static int gs_wxBusyCursorCount = 0;
 
 // Set the cursor to the busy cursor for all windows
 void wxBeginBusyCursor(wxCursor *cursor)
 {
 
 // Set the cursor to the busy cursor for all windows
 void wxBeginBusyCursor(wxCursor *cursor)
 {
-  wxBusyCursorCount ++;
-  if (wxBusyCursorCount == 1)
-  {
-    wxBusyCursorOld = ::SetCursor((HCURSOR) cursor->GetHCURSOR());
-  }
-  else
-  {
-    (void)::SetCursor((HCURSOR) cursor->GetHCURSOR());
-  }
+    if ( gs_wxBusyCursorCount++ == 0 )
+    {
+        gs_wxBusyCursor = (HCURSOR)cursor->GetHCURSOR();
+        gs_wxBusyCursorOld = ::SetCursor(gs_wxBusyCursor);
+    }
+    //else: nothing to do, already set
 }
 
 // Restore cursor to normal
 }
 
 // Restore cursor to normal
-void wxEndBusyCursor(void)
+void wxEndBusyCursor()
 {
 {
-  if (wxBusyCursorCount == 0)
-    return;
-    
-  wxBusyCursorCount --;
-  if (wxBusyCursorCount == 0)
-  {
-    ::SetCursor(wxBusyCursorOld);
-    wxBusyCursorOld = 0;
-  }
+    wxCHECK_RET( gs_wxBusyCursorCount > 0,
+                 _T("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
+
+    if ( --gs_wxBusyCursorCount == 0 )
+    {
+        ::SetCursor(gs_wxBusyCursorOld);
+
+        gs_wxBusyCursorOld = 0;
+    }
 }
 
 // TRUE if we're between the above two calls
 }
 
 // TRUE if we're between the above two calls
-bool wxIsBusy(void)
+bool wxIsBusy()
 {
 {
-  return (wxBusyCursorCount > 0);
-}    
+  return (gs_wxBusyCursorCount > 0);
+}
 
 
-const char* wxGetHomeDir(wxString *pstr)
+// ---------------------------------------------------------------------------
+const wxChar* wxGetHomeDir(wxString *pstr)
 {
   wxString& strDir = *pstr;
 
 {
   wxString& strDir = *pstr;
 
-  #ifdef __UNIX__
-    const char *szHome = getenv("HOME");
+  #if defined(__UNIX__) && !defined(__TWIN32__)
+    const wxChar *szHome = wxGetenv("HOME");
     if ( szHome == NULL ) {
       // we're homeless...
       wxLogWarning(_("can't find user's HOME, using current directory."));
     if ( szHome == NULL ) {
       // we're homeless...
       wxLogWarning(_("can't find user's HOME, using current directory."));
-      strDir = ".";
+      strDir = _T(".");
     }
     else
        strDir = szHome;
 
     // add a trailing slash if needed
     }
     else
        strDir = szHome;
 
     // add a trailing slash if needed
-    if ( strDir.Last() != '/' )
-      strDir << '/';
+    if ( strDir.Last() != _T('/') )
+      strDir << _T('/');
   #else   // Windows
     #ifdef  __WIN32__
   #else   // Windows
     #ifdef  __WIN32__
-      const char *szHome = getenv("HOMEDRIVE");
+      const wxChar *szHome = wxGetenv(_T("HOMEDRIVE"));
       if ( szHome != NULL )
         strDir << szHome;
       if ( szHome != NULL )
         strDir << szHome;
-      szHome = getenv("HOMEPATH");
+      szHome = wxGetenv(_T("HOMEPATH"));
       if ( szHome != NULL ) {
         strDir << szHome;
 
       if ( szHome != NULL ) {
         strDir << szHome;
 
@@ -535,7 +605,7 @@ const char* wxGetHomeDir(wxString *pstr)
         // create it in our program's dir. However, if the user took care
         // to set HOMEPATH to something other than "\\", we suppose that he
         // knows what he is doing and use the supplied value.
         // create it in our program's dir. However, if the user took care
         // to set HOMEPATH to something other than "\\", we suppose that he
         // knows what he is doing and use the supplied value.
-        if ( strcmp(szHome, "\\") != 0 )
+        if ( wxStrcmp(szHome, _T("\\")) != 0 )
           return strDir.c_str();
       }
 
           return strDir.c_str();
       }
 
@@ -562,29 +632,29 @@ const char* wxGetHomeDir(wxString *pstr)
 }
 
 // Hack for MS-DOS
 }
 
 // Hack for MS-DOS
-char *wxGetUserHome (const wxString& user)
+wxChar *wxGetUserHome (const wxString& user)
 {
 {
-  char *home;
+  wxChar *home;
   wxString user1(user);
 
   wxString user1(user);
 
-  if (user1 != "") {
-    char tmp[64];
+  if (user1 != _T("")) {
+    wxChar tmp[64];
     if (wxGetUserId(tmp, sizeof(tmp)/sizeof(char))) {
       // Guests belong in the temp dir
     if (wxGetUserId(tmp, sizeof(tmp)/sizeof(char))) {
       // Guests belong in the temp dir
-      if (Stricmp(tmp, "annonymous") == 0) {
-        if ((home = getenv("TMP")) != NULL ||
-            (home = getenv("TMPDIR")) != NULL ||
-            (home = getenv("TEMP")) != NULL)
-            return *home ? home : "\\";
+      if (wxStricmp(tmp, _T("annonymous")) == 0) {
+        if ((home = wxGetenv(_T("TMP"))) != NULL ||
+            (home = wxGetenv(_T("TMPDIR"))) != NULL ||
+            (home = wxGetenv(_T("TEMP"))) != NULL)
+            return *home ? home : (wxChar*)_T("\\");
       }
       }
-      if (Stricmp(tmp, WXSTRINGCAST user1) == 0)
-        user1 = "";
+      if (wxStricmp(tmp, WXSTRINGCAST user1) == 0)
+        user1 = _T("");
     }
   }
     }
   }
-  if (user1 == "")
-    if ((home = getenv("HOME")) != NULL)
+  if (user1 == _T(""))
+    if ((home = wxGetenv(_T("HOME"))) != NULL)
     {
     {
-      strcpy(wxBuffer, home);
+      wxStrcpy(wxBuffer, home);
       Unix2DosFilename(wxBuffer);
       return wxBuffer;
     }
       Unix2DosFilename(wxBuffer);
       return wxBuffer;
     }
@@ -605,7 +675,8 @@ bool wxCheckForInterrupt(wxWindow *wnd)
     return TRUE;//*** temporary?
   }
   else{
     return TRUE;//*** temporary?
   }
   else{
-    wxError("wnd==NULL !!!");
+    wxFAIL_MSG(_T("wnd==NULL !!!"));
+
     return FALSE;//*** temporary?
   }
 }
     return FALSE;//*** temporary?
   }
 }
@@ -614,10 +685,10 @@ bool wxCheckForInterrupt(wxWindow *wnd)
 // Returns NULL or newly-allocated memory, so use delete[] to clean up.
 
 #ifdef __WXMSW__
 // Returns NULL or newly-allocated memory, so use delete[] to clean up.
 
 #ifdef __WXMSW__
-char *wxLoadUserResource(const wxString& resourceName, const wxString& resourceType)
+wxChar *wxLoadUserResource(const wxString& resourceName, const wxString& resourceType)
 {
 {
-  char *s = NULL;
-#ifndef __WIN32__
+  wxChar *s = NULL;
+#if !defined(__WIN32__) || defined(__TWIN32__)
   HRSRC hResource = ::FindResource(wxGetInstance(), WXSTRINGCAST resourceName, WXSTRINGCAST resourceType);
 #else
 #ifdef UNICODE
   HRSRC hResource = ::FindResource(wxGetInstance(), WXSTRINGCAST resourceName, WXSTRINGCAST resourceType);
 #else
 #ifdef UNICODE
@@ -632,10 +703,10 @@ char *wxLoadUserResource(const wxString& resourceName, const wxString& resourceT
   HGLOBAL hData = ::LoadResource(wxGetInstance(), hResource);
   if (hData == 0)
     return NULL;
   HGLOBAL hData = ::LoadResource(wxGetInstance(), hResource);
   if (hData == 0)
     return NULL;
-  char *theText = (char *)LockResource(hData);
+  wxChar *theText = (wxChar *)LockResource(hData);
   if (!theText)
     return NULL;
   if (!theText)
     return NULL;
-    
+
   s = copystring(theText);
 
   // Obsolete in WIN32
   s = copystring(theText);
 
   // Obsolete in WIN32
@@ -659,36 +730,36 @@ void wxGetMousePosition( int* x, int* y )
 };
 
 // Return TRUE if we have a colour display
 };
 
 // Return TRUE if we have a colour display
-bool wxColourDisplay(void)
+bool wxColourDisplay()
 {
 {
-  HDC dc = ::GetDC(NULL);
+  HDC dc = ::GetDC((HWND) NULL);
   bool flag;
   int noCols = GetDeviceCaps(dc, NUMCOLORS);
   if ((noCols == -1) || (noCols > 2))
     flag = TRUE;
   else
     flag = FALSE;
   bool flag;
   int noCols = GetDeviceCaps(dc, NUMCOLORS);
   if ((noCols == -1) || (noCols > 2))
     flag = TRUE;
   else
     flag = FALSE;
-  ReleaseDC(NULL, dc);
+  ReleaseDC((HWND) NULL, dc);
   return flag;
 }
 
 // Returns depth of screen
   return flag;
 }
 
 // Returns depth of screen
-int wxDisplayDepth(void)
+int wxDisplayDepth()
 {
 {
-  HDC dc = ::GetDC(NULL);
+  HDC dc = ::GetDC((HWND) NULL);
   int planes = GetDeviceCaps(dc, PLANES);
   int bitsPerPixel = GetDeviceCaps(dc, BITSPIXEL);
   int depth = planes*bitsPerPixel;
   int planes = GetDeviceCaps(dc, PLANES);
   int bitsPerPixel = GetDeviceCaps(dc, BITSPIXEL);
   int depth = planes*bitsPerPixel;
-  ReleaseDC(NULL, dc);
+  ReleaseDC((HWND) NULL, dc);
   return depth;
 }
 
 // Get size of display
 void wxDisplaySize(int *width, int *height)
 {
   return depth;
 }
 
 // Get size of display
 void wxDisplaySize(int *width, int *height)
 {
-  HDC dc = ::GetDC(NULL);
+  HDC dc = ::GetDC((HWND) NULL);
   *width = GetDeviceCaps(dc, HORZRES); *height = GetDeviceCaps(dc, VERTRES);
   *width = GetDeviceCaps(dc, HORZRES); *height = GetDeviceCaps(dc, VERTRES);
-  ReleaseDC(NULL, dc);
+  ReleaseDC((HWND) NULL, dc);
 }
 
 bool wxDirExists(const wxString& dir)
 }
 
 bool wxDirExists(const wxString& dir)
@@ -705,14 +776,14 @@ bool wxDirExists(const wxString& dir)
 #endif
 
 #if defined(__WIN32__)
 #endif
 
 #if defined(__WIN32__)
-       HANDLE h = FindFirstFile((LPTSTR) WXSTRINGCAST dir,(LPWIN32_FIND_DATA)&fileInfo);
-
-       if (h==INVALID_HANDLE_VALUE)
-        return FALSE;
-       else {
-        FindClose(h);
-        return ((fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY);
-       }
+  HANDLE h = FindFirstFile((LPTSTR) WXSTRINGCAST dir,(LPWIN32_FIND_DATA)&fileInfo);
+
+  if (h==INVALID_HANDLE_VALUE)
+   return FALSE;
+  else {
+   FindClose(h);
+   return ((fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY);
+  }
 #else
   // In Borland findfirst has a different argument
   // ordering from _dos_findfirst. But _dos_findfirst
 #else
   // In Borland findfirst has a different argument
   // ordering from _dos_findfirst. But _dos_findfirst
@@ -725,6 +796,10 @@ bool wxDirExists(const wxString& dir)
 #endif
 }
 
 #endif
 }
 
+// ---------------------------------------------------------------------------
+// window information functions
+// ---------------------------------------------------------------------------
+
 wxString WXDLLEXPORT wxGetWindowText(WXHWND hWnd)
 {
     wxString str;
 wxString WXDLLEXPORT wxGetWindowText(WXHWND hWnd)
 {
     wxString str;
@@ -735,6 +810,58 @@ wxString WXDLLEXPORT wxGetWindowText(WXHWND hWnd)
     return str;
 }
 
     return str;
 }
 
+wxString WXDLLEXPORT wxGetWindowClass(WXHWND hWnd)
+{
+    wxString str;
+
+    int len = 256; // some starting value
+
+    for ( ;; )
+    {
+        // as we've #undefined GetClassName we must now manually choose the
+        // right function to call
+        int count =
+
+        #ifndef __WIN32__
+            GetClassName
+        #else // Win32
+            #ifdef UNICODE
+                GetClassNameW
+            #else // !Unicode
+                #ifdef __TWIN32__
+                    GetClassName
+                #else // !Twin32
+                    GetClassNameA
+                #endif // Twin32/!Twin32
+            #endif // Unicode/ANSI
+        #endif // Win16/32
+                                    ((HWND)hWnd, str.GetWriteBuf(len), len);
+
+        str.UngetWriteBuf();
+        if ( count == len )
+        {
+            // the class name might have been truncated, retry with larger
+            // buffer
+            len *= 2;
+        }
+        else
+        {
+            break;
+        }
+    }
+
+    return str;
+}
+
+WXWORD WXDLLEXPORT wxGetWindowId(WXHWND hWnd)
+{
+#ifndef __WIN32__
+    return GetWindowWord((HWND)hWnd, GWW_ID);
+#else // Win32
+    return GetWindowLong((HWND)hWnd, GWL_ID);
+#endif // Win16/32
+}
+
 #if 0
 //------------------------------------------------------------------------
 // wild character routines
 #if 0
 //------------------------------------------------------------------------
 // wild character routines
@@ -745,13 +872,13 @@ bool wxIsWild( const wxString& pattern )
   wxString tmp = pattern;
   char *pat = WXSTRINGCAST(tmp);
     while (*pat) {
   wxString tmp = pattern;
   char *pat = WXSTRINGCAST(tmp);
     while (*pat) {
-       switch (*pat++) {
-       case '?': case '*': case '[': case '{':
-           return TRUE;
-       case '\\':
-           if (!*pat++)
-               return FALSE;
-       }
+  switch (*pat++) {
+  case '?': case '*': case '[': case '{':
+      return TRUE;
+  case '\\':
+      if (!*pat++)
+    return FALSE;
+  }
     }
     return FALSE;
 };
     }
     return FALSE;
 };
@@ -771,124 +898,124 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special )
 
     // dot_special means '.' only matches '.'
     if (dot_special && *str == '.' && *pattern != *str)
 
     // dot_special means '.' only matches '.'
     if (dot_special && *str == '.' && *pattern != *str)
-       return FALSE;
+  return FALSE;
 
     while ((*pattern != '\0') && (!done)
     && (((*str=='\0')&&((*pattern==OB)||(*pattern=='*')))||(*str!='\0'))) {
 
     while ((*pattern != '\0') && (!done)
     && (((*str=='\0')&&((*pattern==OB)||(*pattern=='*')))||(*str!='\0'))) {
-       switch (*pattern) {
-       case '\\':
-           pattern++;
-           if (*pattern != '\0')
-               pattern++;
-           break;
-       case '*':
-           pattern++;
-           ret_code = FALSE;
-           while ((*str!='\0')
-           && (!(ret_code=wxMatchWild(pattern, str++, FALSE))))
-               /*loop*/;
-           if (ret_code) {
-               while (*str != '\0')
-                   str++;
-               while (*pattern != '\0')
-                   pattern++;
-           }
-           break;
-       case '[':
-           pattern++;
-         repeat:
-           if ((*pattern == '\0') || (*pattern == ']')) {
-               done = TRUE;
-               break;
-           }
-           if (*pattern == '\\') {
-               pattern++;
-               if (*pattern == '\0') {
-                   done = TRUE;
-                   break;
-               }
-           }
-           if (*(pattern + 1) == '-') {
-               c = *pattern;
-               pattern += 2;
-               if (*pattern == ']') {
-                   done = TRUE;
-                   break;
-               }
-               if (*pattern == '\\') {
-                   pattern++;
-                   if (*pattern == '\0') {
-                       done = TRUE;
-                       break;
-                   }
-               }
-               if ((*str < c) || (*str > *pattern)) {
-                   pattern++;
-                   goto repeat;
-               }
-           } else if (*pattern != *str) {
-               pattern++;
-               goto repeat;
-           }
-           pattern++;
-           while ((*pattern != ']') && (*pattern != '\0')) {
-               if ((*pattern == '\\') && (*(pattern + 1) != '\0'))
-                   pattern++;
-               pattern++;
-           }
-           if (*pattern != '\0') {
-               pattern++, str++;
-           }
-           break;
-       case '?':
-           pattern++;
-           str++;
-           break;
-       case OB:
-           pattern++;
-           while ((*pattern != CB) && (*pattern != '\0')) {
-               cp = str;
-               ok = TRUE;
-               while (ok && (*cp != '\0') && (*pattern != '\0')
-               &&  (*pattern != ',') && (*pattern != CB)) {
-                   if (*pattern == '\\')
-                       pattern++;
-                   ok = (*pattern++ == *cp++);
-               }
-               if (*pattern == '\0') {
-                   ok = FALSE;
-                   done = TRUE;
-                   break;
-               } else if (ok) {
-                   str = cp;
-                   while ((*pattern != CB) && (*pattern != '\0')) {
-                       if (*++pattern == '\\') {
-                           if (*++pattern == CB)
-                               pattern++;
-                       }
-                   }
-               } else {
-                   while (*pattern!=CB && *pattern!=',' && *pattern!='\0') {
-                       if (*++pattern == '\\') {
+  switch (*pattern) {
+  case '\\':
+      pattern++;
+      if (*pattern != '\0')
+    pattern++;
+      break;
+  case '*':
+      pattern++;
+      ret_code = FALSE;
+      while ((*str!='\0')
+      && (!(ret_code=wxMatchWild(pattern, str++, FALSE))))
+    /*loop*/;
+      if (ret_code) {
+    while (*str != '\0')
+        str++;
+    while (*pattern != '\0')
+        pattern++;
+      }
+      break;
+  case '[':
+      pattern++;
+    repeat:
+      if ((*pattern == '\0') || (*pattern == ']')) {
+    done = TRUE;
+    break;
+      }
+      if (*pattern == '\\') {
+    pattern++;
+    if (*pattern == '\0') {
+        done = TRUE;
+        break;
+    }
+      }
+      if (*(pattern + 1) == '-') {
+    c = *pattern;
+    pattern += 2;
+    if (*pattern == ']') {
+        done = TRUE;
+        break;
+    }
+    if (*pattern == '\\') {
+        pattern++;
+        if (*pattern == '\0') {
+      done = TRUE;
+      break;
+        }
+    }
+    if ((*str < c) || (*str > *pattern)) {
+        pattern++;
+        goto repeat;
+    }
+      } else if (*pattern != *str) {
+    pattern++;
+    goto repeat;
+      }
+      pattern++;
+      while ((*pattern != ']') && (*pattern != '\0')) {
+    if ((*pattern == '\\') && (*(pattern + 1) != '\0'))
+        pattern++;
+    pattern++;
+      }
+      if (*pattern != '\0') {
+    pattern++, str++;
+      }
+      break;
+  case '?':
+      pattern++;
+      str++;
+      break;
+  case OB:
+      pattern++;
+      while ((*pattern != CB) && (*pattern != '\0')) {
+    cp = str;
+    ok = TRUE;
+    while (ok && (*cp != '\0') && (*pattern != '\0')
+    &&  (*pattern != ',') && (*pattern != CB)) {
+        if (*pattern == '\\')
+      pattern++;
+        ok = (*pattern++ == *cp++);
+    }
+    if (*pattern == '\0') {
+        ok = FALSE;
+        done = TRUE;
+        break;
+    } else if (ok) {
+        str = cp;
+        while ((*pattern != CB) && (*pattern != '\0')) {
+      if (*++pattern == '\\') {
+          if (*++pattern == CB)
+        pattern++;
+      }
+        }
+    } else {
+        while (*pattern!=CB && *pattern!=',' && *pattern!='\0') {
+      if (*++pattern == '\\') {
                             if (*++pattern == CB || *pattern == ',')
                             if (*++pattern == CB || *pattern == ',')
-                               pattern++;
-                       }
-                   }
-               }
-               if (*pattern != '\0')
-                   pattern++;
-           }
-           break;
-       default:
-           if (*str == *pattern) {
-               str++, pattern++;
-           } else {
-               done = TRUE;
-           }
-       }
+        pattern++;
+      }
+        }
+    }
+    if (*pattern != '\0')
+        pattern++;
+      }
+      break;
+  default:
+      if (*str == *pattern) {
+    str++, pattern++;
+      } else {
+    done = TRUE;
+      }
+  }
     }
     while (*pattern == '*')
     }
     while (*pattern == '*')
-       pattern++;
+  pattern++;
     return ((*str == '\0') && (*pattern == '\0'));
 };
 
     return ((*str == '\0') && (*pattern == '\0'));
 };
 
@@ -903,10 +1030,10 @@ on MSDN was a step in the right direction, but it is a console application
 and thus has limited features and extensibility.  DBWIN32 is my creation
 to solve this problem.
 
 and thus has limited features and extensibility.  DBWIN32 is my creation
 to solve this problem.
 
-The code is essentially a merging of a stripped down version of the DBWIN code 
+The code is essentially a merging of a stripped down version of the DBWIN code
 from VC 1.5 and DBMON.C with a few 32 bit changes.
 
 from VC 1.5 and DBMON.C with a few 32 bit changes.
 
-As of version 1.2B, DBWIN32 supports both Win95 and NT.  The NT support is 
+As of version 1.2B, DBWIN32 supports both Win95 and NT.  The NT support is
 built into the operating system and works just by running DBWIN32.  The Win95
 team decided not to support this hook, so I have provided code that will do
 this for you.  See the file WIN95.TXT for instructions on installing this.
 built into the operating system and works just by running DBWIN32.  The Win95
 team decided not to support this hook, so I have provided code that will do
 this for you.  See the file WIN95.TXT for instructions on installing this.
@@ -922,33 +1049,39 @@ To download dbwin32, see e.g.:
 http://ftp.digital.com/pub/micro/NT/WinSite/programr/dbwin32.zip
 */
 
 http://ftp.digital.com/pub/micro/NT/WinSite/programr/dbwin32.zip
 */
 
+#if !defined(__MWERKS__) && !defined(__SALFORDC__) && !defined(__TWIN32__)
 #include <process.h>
 #include <process.h>
+#endif
 
 
-void OutputDebugStringW95(const char* lpOutputString, ...)
+void OutputDebugStringW95(const wxChar* lpOutputString, ...)
 {
     HANDLE heventDBWIN;  /* DBWIN32 synchronization object */
     HANDLE heventData;   /* data passing synch object */
     HANDLE hSharedFile;  /* memory mapped file shared data */
     LPSTR lpszSharedMem;
 {
     HANDLE heventDBWIN;  /* DBWIN32 synchronization object */
     HANDLE heventData;   /* data passing synch object */
     HANDLE hSharedFile;  /* memory mapped file shared data */
     LPSTR lpszSharedMem;
-    char achBuffer[500];
+    wxChar achBuffer[500];
 
     /* create the output buffer */
     va_list args;
     va_start(args, lpOutputString);
 
     /* create the output buffer */
     va_list args;
     va_start(args, lpOutputString);
-    vsprintf(achBuffer, lpOutputString, args);
+    wxVsprintf(achBuffer, lpOutputString, args);
     va_end(args);
 
     va_end(args);
 
-    /* 
-        Do a regular OutputDebugString so that the output is 
+    /*
+        Do a regular OutputDebugString so that the output is
         still seen in the debugger window if it exists.
 
         still seen in the debugger window if it exists.
 
-        This ifdef is necessary to avoid infinite recursion 
+        This ifdef is necessary to avoid infinite recursion
         from the inclusion of W95TRACE.H
     */
 #ifdef _UNICODE
     ::OutputDebugStringW(achBuffer);
         from the inclusion of W95TRACE.H
     */
 #ifdef _UNICODE
     ::OutputDebugStringW(achBuffer);
+#else
+#ifdef __TWIN32__
+    ::OutputDebugString(achBuffer);
 #else
     ::OutputDebugStringA(achBuffer);
 #else
     ::OutputDebugStringA(achBuffer);
+#endif
 #endif
 
     /* bail if it's not Win95 */
 #endif
 
     /* bail if it's not Win95 */
@@ -961,35 +1094,35 @@ void OutputDebugStringW95(const char* lpOutputString, ...)
     }
 
     /* make sure DBWIN is open and waiting */
     }
 
     /* make sure DBWIN is open and waiting */
-    heventDBWIN = OpenEvent(EVENT_MODIFY_STATE, FALSE, "DBWIN_BUFFER_READY");
+    heventDBWIN = OpenEvent(EVENT_MODIFY_STATE, FALSE, _T("DBWIN_BUFFER_READY"));
     if ( !heventDBWIN )
     {
     if ( !heventDBWIN )
     {
-        //MessageBox(NULL, "DBWIN_BUFFER_READY nonexistent", NULL, MB_OK);
-        return;            
+        //MessageBox(NULL, _T("DBWIN_BUFFER_READY nonexistent"), NULL, MB_OK);
+        return;
     }
 
     /* get a handle to the data synch object */
     }
 
     /* get a handle to the data synch object */
-    heventData = OpenEvent(EVENT_MODIFY_STATE, FALSE, "DBWIN_DATA_READY");
+    heventData = OpenEvent(EVENT_MODIFY_STATE, FALSE, _T("DBWIN_DATA_READY"));
     if ( !heventData )
     {
     if ( !heventData )
     {
-        // MessageBox(NULL, "DBWIN_DATA_READY nonexistent", NULL, MB_OK);
+        // MessageBox(NULL, _T("DBWIN_DATA_READY nonexistent"), NULL, MB_OK);
         CloseHandle(heventDBWIN);
         CloseHandle(heventDBWIN);
-        return;            
+        return;
     }
     }
-    
-    hSharedFile = CreateFileMapping((HANDLE)-1, NULL, PAGE_READWRITE, 0, 4096, "DBWIN_BUFFER");
-    if (!hSharedFile) 
+
+    hSharedFile = CreateFileMapping((HANDLE)-1, NULL, PAGE_READWRITE, 0, 4096, _T("DBWIN_BUFFER"));
+    if (!hSharedFile)
     {
     {
-        //MessageBox(NULL, "DebugTrace: Unable to create file mapping object DBWIN_BUFFER", "Error", MB_OK);
+        //MessageBox(NULL, _T("DebugTrace: Unable to create file mapping object DBWIN_BUFFER"), _T("Error"), MB_OK);
         CloseHandle(heventDBWIN);
         CloseHandle(heventData);
         return;
     }
 
     lpszSharedMem = (LPSTR)MapViewOfFile(hSharedFile, FILE_MAP_WRITE, 0, 0, 512);
         CloseHandle(heventDBWIN);
         CloseHandle(heventData);
         return;
     }
 
     lpszSharedMem = (LPSTR)MapViewOfFile(hSharedFile, FILE_MAP_WRITE, 0, 0, 512);
-    if (!lpszSharedMem) 
+    if (!lpszSharedMem)
     {
     {
-        //MessageBox(NULL, "DebugTrace: Unable to map shared memory", "Error", MB_OK);
+        //MessageBox(NULL, _T("DebugTrace: Unable to map shared memory"), _T("Error"), MB_OK);
         CloseHandle(heventDBWIN);
         CloseHandle(heventData);
         return;
         CloseHandle(heventDBWIN);
         CloseHandle(heventData);
         return;
@@ -999,13 +1132,13 @@ void OutputDebugStringW95(const char* lpOutputString, ...)
     WaitForSingleObject(heventDBWIN, INFINITE);
 
     /* write it to the shared memory */
     WaitForSingleObject(heventDBWIN, INFINITE);
 
     /* write it to the shared memory */
-#ifdef __BORLANDC__
+#if defined( __BORLANDC__ ) || defined( __MWERKS__ ) || defined(__SALFORDC__)
     *((LPDWORD)lpszSharedMem) = getpid();
 #else
     *((LPDWORD)lpszSharedMem) = _getpid();
 #endif
 
     *((LPDWORD)lpszSharedMem) = getpid();
 #else
     *((LPDWORD)lpszSharedMem) = _getpid();
 #endif
 
-    wsprintf(lpszSharedMem + sizeof(DWORD), "%s", achBuffer);
+    wsprintf((LPTSTR)(lpszSharedMem + sizeof(DWORD)), _T("%s"), achBuffer);
 
     /* signal data ready event */
     SetEvent(heventData);
 
     /* signal data ready event */
     SetEvent(heventData);
@@ -1021,3 +1154,69 @@ void OutputDebugStringW95(const char* lpOutputString, ...)
 
 #endif
 
 
 #endif
 
+
+#if 0
+
+// maximum mumber of lines the output console should have
+static const WORD MAX_CONSOLE_LINES = 500;
+
+BOOL WINAPI MyConsoleHandler( DWORD dwCtrlType ) {   //  control signal type
+  FreeConsole();
+  return TRUE;
+}
+
+void wxRedirectIOToConsole()
+{
+    int                        hConHandle;
+    long                       lStdHandle;
+    CONSOLE_SCREEN_BUFFER_INFO coninfo;
+    FILE                       *fp;
+
+    // allocate a console for this app
+    AllocConsole();
+
+    // set the screen buffer to be big enough to let us scroll text
+    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),
+                               &coninfo);
+    coninfo.dwSize.Y = MAX_CONSOLE_LINES;
+    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),
+                               coninfo.dwSize);
+
+    // redirect unbuffered STDOUT to the console
+    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
+    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
+    if(hConHandle <= 0) return;
+    fp = _fdopen( hConHandle, "w" );
+    *stdout = *fp;
+    setvbuf( stdout, NULL, _IONBF, 0 );
+
+    // redirect unbuffered STDIN to the console
+    lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
+    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
+    if(hConHandle <= 0) return;
+    fp = _fdopen( hConHandle, "r" );
+    *stdin = *fp;
+    setvbuf( stdin, NULL, _IONBF, 0 );
+
+    // redirect unbuffered STDERR to the console
+    lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
+    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
+    if(hConHandle <= 0) return;
+    fp = _fdopen( hConHandle, "w" );
+    *stderr = *fp;
+    setvbuf( stderr, NULL, _IONBF, 0 );
+
+    // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog
+    // point to console as well
+    ios::sync_with_stdio();
+
+    SetConsoleCtrlHandler(MyConsoleHandler, TRUE);
+}
+#else
+// Not supported
+void wxRedirectIOToConsole()
+{
+}
+#endif
+
+