]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/dde.cpp
wxSpinButton::GetValue() returns correct result now
[wxWidgets.git] / src / msw / dde.cpp
index c46f04c2330f2dcaaa991e15bc48e3b52f729927..2d28519eccd48830ed0e8a9d09bbe3b22565ecd8 100644 (file)
 #include "wx/app.h"
 #endif
 
 #include "wx/app.h"
 #endif
 
-#include "wx/msw/private.h"
+#include "wx/module.h"
 #include "wx/dde.h"
 
 #include "wx/dde.h"
 
+#include "wx/msw/private.h"
+#include <windows.h>
+#include <ddeml.h>
+
+#ifndef __TWIN32__
 #ifdef __GNUWIN32__
 #include "wx/msw/gnuwin32/extra.h"
 #endif
 #ifdef __GNUWIN32__
 #include "wx/msw/gnuwin32/extra.h"
 #endif
+#endif
 
 
-#include <windows.h>
-#include <ddeml.h>
 #include <string.h>
 
 #ifdef __WIN32__
 #include <string.h>
 
 #ifdef __WIN32__
@@ -118,6 +122,21 @@ void wxDDECleanUp()
     delete [] DDEDefaultIPCBuffer ;
 }
 
     delete [] DDEDefaultIPCBuffer ;
 }
 
+// A module to allow DDE initialization/cleanup
+// without calling these functions from app.cpp or from
+// the user's application.
+
+class wxDDEModule: public wxModule
+{
+DECLARE_DYNAMIC_CLASS(wxDDEModule)
+public:
+    wxDDEModule() {}
+    bool OnInit() { wxDDEInitialize(); return TRUE; };
+    void OnExit() { wxDDECleanUp(); };
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxDDEModule, wxModule)
+
 // Global find connection
 static wxDDEConnection *DDEFindConnection(HCONV hConv)
 {
 // Global find connection
 static wxDDEConnection *DDEFindConnection(HCONV hConv)
 {
@@ -195,9 +214,9 @@ wxDDEServer::wxDDEServer(void)
 bool wxDDEServer::Create(const wxString& server_name)
 {
   m_serviceName = server_name;
 bool wxDDEServer::Create(const wxString& server_name)
 {
   m_serviceName = server_name;
-  HSZ serviceName = DdeCreateStringHandle(DDEIdInst, (char*) (const char *)server_name, CP_WINANSI);
+  HSZ serviceName = DdeCreateStringHandle(DDEIdInst, WXSTRINGCAST server_name, CP_WINANSI);
 
 
-  if (DdeNameService(DDEIdInst, serviceName, NULL, DNS_REGISTER) == 0)
+  if (DdeNameService(DDEIdInst, serviceName, (HSZ) NULL, DNS_REGISTER) == 0)
   {
     DDEPrintError();
     return FALSE;
   {
     DDEPrintError();
     return FALSE;
@@ -207,9 +226,9 @@ bool wxDDEServer::Create(const wxString& server_name)
 
 wxDDEServer::~wxDDEServer(void)
 {
 
 wxDDEServer::~wxDDEServer(void)
 {
-  if (m_serviceName != "")
+  if (m_serviceName != _T(""))
   {
   {
-    HSZ serviceName = DdeCreateStringHandle(DDEIdInst, (char*) (const char *)m_serviceName, CP_WINANSI);
+    HSZ serviceName = DdeCreateStringHandle(DDEIdInst, WXSTRINGCAST m_serviceName, CP_WINANSI);
     if (DdeNameService(DDEIdInst, serviceName, NULL, DNS_UNREGISTER) == 0)
     {
       DDEPrintError();
     if (DdeNameService(DDEIdInst, serviceName, NULL, DNS_UNREGISTER) == 0)
     {
       DDEPrintError();
@@ -305,12 +324,12 @@ bool wxDDEClient::ValidHost(const wxString& /* host */)
 
 wxConnectionBase *wxDDEClient::MakeConnection(const wxString& /* host */, const wxString& server_name, const wxString& topic)
 {
 
 wxConnectionBase *wxDDEClient::MakeConnection(const wxString& /* host */, const wxString& server_name, const wxString& topic)
 {
-  HSZ serviceName = DdeCreateStringHandle(DDEIdInst, (char*) (const char *)server_name, CP_WINANSI);
-  HSZ topic_atom = DdeCreateStringHandle(DDEIdInst, (char*) (const char *)topic, CP_WINANSI);
+  HSZ serviceName = DdeCreateStringHandle(DDEIdInst, WXSTRINGCAST server_name, CP_WINANSI);
+  HSZ topic_atom = DdeCreateStringHandle(DDEIdInst, WXSTRINGCAST topic, CP_WINANSI);
 
   HCONV hConv = DdeConnect(DDEIdInst, serviceName, topic_atom, (PCONVCONTEXT)NULL);
 
   HCONV hConv = DdeConnect(DDEIdInst, serviceName, topic_atom, (PCONVCONTEXT)NULL);
-  if (hConv == NULL)
-    return NULL;
+  if (hConv == (HCONV) NULL)
+    return (wxConnectionBase*) NULL;
   else
   {
     wxDDEConnection *connection = (wxDDEConnection*) OnMakeConnection();
   else
   {
     wxDDEConnection *connection = (wxDDEConnection*) OnMakeConnection();
@@ -322,7 +341,7 @@ wxConnectionBase *wxDDEClient::MakeConnection(const wxString& /* host */, const
       m_connections.Append(connection);
       return connection;
     }
       m_connections.Append(connection);
       return connection;
     }
-    else return NULL;
+    else return (wxConnectionBase*) NULL;
   }
 }
 
   }
 }
 
@@ -420,11 +439,11 @@ bool wxDDEConnection::Disconnect(void)
   return (DdeDisconnect((HCONV) m_hConv) != 0);
 }
 
   return (DdeDisconnect((HCONV) m_hConv) != 0);
 }
 
-bool wxDDEConnection::Execute(char *data, int size, wxDataFormat format)
+bool wxDDEConnection::Execute(wxChar *data, int size, wxIPCFormat format)
 {
   DWORD result;
   if (size < 0)
 {
   DWORD result;
   if (size < 0)
-    size = strlen(data);
+    size = wxStrlen(data);
 
   size ++;
 
 
   size ++;
 
@@ -432,7 +451,7 @@ bool wxDDEConnection::Execute(char *data, int size, wxDataFormat format)
     NULL, format, XTYP_EXECUTE, 5000, &result) ? TRUE : FALSE);
 }
 
     NULL, format, XTYP_EXECUTE, 5000, &result) ? TRUE : FALSE);
 }
 
-char *wxDDEConnection::Request(const wxString& item, int *size, wxDataFormat format)
+char *wxDDEConnection::Request(const wxString& item, int *size, wxIPCFormat format)
 {
   DWORD result;
   HSZ atom = DDEGetAtom(item);
 {
   DWORD result;
   HSZ atom = DDEGetAtom(item);
@@ -452,11 +471,11 @@ char *wxDDEConnection::Request(const wxString& item, int *size, wxDataFormat for
   else return NULL;
 }
 
   else return NULL;
 }
 
-bool wxDDEConnection::Poke(const wxString& item, char *data, int size, wxDataFormat format)
+bool wxDDEConnection::Poke(const wxString& item, wxChar *data, int size, wxIPCFormat format)
 {
   DWORD result;
   if (size < 0)
 {
   DWORD result;
   if (size < 0)
-    size = strlen(data);
+    size = wxStrlen(data);
 
   size ++;
 
 
   size ++;
 
@@ -484,10 +503,10 @@ bool wxDDEConnection::StopAdvise(const wxString& item)
 }
 
 // Calls that SERVER can make
 }
 
 // Calls that SERVER can make
-bool wxDDEConnection::Advise(const wxString& item, char *data, int size, wxDataFormat format)
+bool wxDDEConnection::Advise(const wxString& item, wxChar *data, int size, wxIPCFormat format)
 {
   if (size < 0)
 {
   if (size < 0)
-    size = strlen(data);
+    size = wxStrlen(data);
 
   size ++;
 
 
   size ++;
 
@@ -522,11 +541,11 @@ DWORD /* lData2 */)
   {
     case XTYP_CONNECT:
     {
   {
     case XTYP_CONNECT:
     {
-      char topic_buf[100];
-      char server_buf[100];
-      DdeQueryString(DDEIdInst, hsz1, (LPSTR)topic_buf, sizeof(topic_buf),
+      wxChar topic_buf[100];
+      wxChar server_buf[100];
+      DdeQueryString(DDEIdInst, hsz1, (LPTSTR)topic_buf, WXSIZEOF(topic_buf),
                      CP_WINANSI);
                      CP_WINANSI);
-      DdeQueryString(DDEIdInst, hsz2, (LPSTR)server_buf, sizeof(topic_buf),
+      DdeQueryString(DDEIdInst, hsz2, (LPTSTR)server_buf, WXSIZEOF(topic_buf),
                      CP_WINANSI);
       wxDDEServer *server = DDEFindServer(server_buf);
       if (server)
                      CP_WINANSI);
       wxDDEServer *server = DDEFindServer(server_buf);
       if (server)
@@ -579,7 +598,7 @@ DWORD /* lData2 */)
       {
         DWORD len = DdeGetData(hData, (LPBYTE)(connection->m_bufPtr), connection->m_bufSize, 0);
         DdeFreeDataHandle(hData);
       {
         DWORD len = DdeGetData(hData, (LPBYTE)(connection->m_bufPtr), connection->m_bufSize, 0);
         DdeFreeDataHandle(hData);
-        if (connection->OnExecute(connection->m_topicName, connection->m_bufPtr, (int)len, (wxDataFormat) wFmt))
+        if (connection->OnExecute(connection->m_topicName, connection->m_bufPtr, (int)len, (wxIPCFormat) wFmt))
           return (DDERETURN)DDE_FACK;
         else
           return (DDERETURN)DDE_FNOTPROCESSED;
           return (DDERETURN)DDE_FACK;
         else
           return (DDERETURN)DDE_FNOTPROCESSED;
@@ -593,12 +612,12 @@ DWORD /* lData2 */)
 
       if (connection)
       {
 
       if (connection)
       {
-        char item_name[200];
-        DdeQueryString(DDEIdInst, hsz2, (LPSTR)item_name, sizeof(item_name),
+        wxChar item_name[200];
+        DdeQueryString(DDEIdInst, hsz2, (LPTSTR)item_name, WXSIZEOF(item_name),
                      CP_WINANSI);
 
         int user_size = -1;
                      CP_WINANSI);
 
         int user_size = -1;
-        char *data = connection->OnRequest(connection->m_topicName, wxString(item_name), &user_size, (wxDataFormat) wFmt);
+        char *data = connection->OnRequest(connection->m_topicName, wxString(item_name), &user_size, (wxIPCFormat) wFmt);
         if (data)
         {
           if (user_size < 0) user_size = strlen(data);
         if (data)
         {
           if (user_size < 0) user_size = strlen(data);
@@ -617,12 +636,12 @@ DWORD /* lData2 */)
 
       if (connection)
       {
 
       if (connection)
       {
-        char item_name[200];
-        DdeQueryString(DDEIdInst, hsz2, (LPSTR)item_name, sizeof(item_name),
+        wxChar item_name[200];
+        DdeQueryString(DDEIdInst, hsz2, (LPTSTR)item_name, WXSIZEOF(item_name),
                      CP_WINANSI);
         DWORD len = DdeGetData(hData, (LPBYTE)(connection->m_bufPtr), connection->m_bufSize, 0);
         DdeFreeDataHandle(hData);
                      CP_WINANSI);
         DWORD len = DdeGetData(hData, (LPBYTE)(connection->m_bufPtr), connection->m_bufSize, 0);
         DdeFreeDataHandle(hData);
-        connection->OnPoke(connection->m_topicName, wxString(item_name), connection->m_bufPtr, (int)len, (wxDataFormat) wFmt);
+        connection->OnPoke(connection->m_topicName, wxString(item_name), connection->m_bufPtr, (int)len, (wxIPCFormat) wFmt);
         return (DDERETURN)DDE_FACK;
       } else return (DDERETURN)DDE_FNOTPROCESSED;
       break;
         return (DDERETURN)DDE_FACK;
       } else return (DDERETURN)DDE_FNOTPROCESSED;
       break;
@@ -634,8 +653,8 @@ DWORD /* lData2 */)
 
       if (connection)
       {
 
       if (connection)
       {
-        char item_name[200];
-        DdeQueryString(DDEIdInst, hsz2, (LPSTR)item_name, sizeof(item_name),
+        wxChar item_name[200];
+        DdeQueryString(DDEIdInst, hsz2, (LPTSTR)item_name, WXSIZEOF(item_name),
                      CP_WINANSI);
 
         return (DDERETURN)connection->OnStartAdvise(connection->m_topicName, wxString(item_name));
                      CP_WINANSI);
 
         return (DDERETURN)connection->OnStartAdvise(connection->m_topicName, wxString(item_name));
@@ -649,8 +668,8 @@ DWORD /* lData2 */)
 
       if (connection)
       {
 
       if (connection)
       {
-        char item_name[200];
-        DdeQueryString(DDEIdInst, hsz2, (LPSTR)item_name, sizeof(item_name),
+        wxChar item_name[200];
+        DdeQueryString(DDEIdInst, hsz2, (LPTSTR)item_name, WXSIZEOF(item_name),
                      CP_WINANSI);
         return (DDERETURN)connection->OnStopAdvise(connection->m_topicName, wxString(item_name));
       } else return (DDERETURN)0;
                      CP_WINANSI);
         return (DDERETURN)connection->OnStopAdvise(connection->m_topicName, wxString(item_name));
       } else return (DDERETURN)0;
@@ -678,13 +697,13 @@ DWORD /* lData2 */)
 
       if (connection)
       {
 
       if (connection)
       {
-        char item_name[200];
-        DdeQueryString(DDEIdInst, hsz2, (LPSTR)item_name, sizeof(item_name),
+        wxChar item_name[200];
+        DdeQueryString(DDEIdInst, hsz2, (LPTSTR)item_name, WXSIZEOF(item_name),
                      CP_WINANSI);
 
         DWORD len = DdeGetData(hData, (LPBYTE)(connection->m_bufPtr), connection->m_bufSize, 0);
         DdeFreeDataHandle(hData);
                      CP_WINANSI);
 
         DWORD len = DdeGetData(hData, (LPBYTE)(connection->m_bufPtr), connection->m_bufSize, 0);
         DdeFreeDataHandle(hData);
-        if (connection->OnAdvise(connection->m_topicName, wxString(item_name), connection->m_bufPtr, (int)len, (wxDataFormat) wFmt))
+        if (connection->OnAdvise(connection->m_topicName, wxString(item_name), connection->m_bufPtr, (int)len, (wxIPCFormat) wFmt))
           return (DDERETURN)DDE_FACK;
         else
           return (DDERETURN)DDE_FNOTPROCESSED;
           return (DDERETURN)DDE_FACK;
         else
           return (DDERETURN)DDE_FNOTPROCESSED;
@@ -698,7 +717,7 @@ DWORD /* lData2 */)
 // Atom table stuff
 static HSZ DDEAddAtom(const wxString& string)
 {
 // Atom table stuff
 static HSZ DDEAddAtom(const wxString& string)
 {
-  HSZ atom = DdeCreateStringHandle(DDEIdInst, (char*) (const char *)string, CP_WINANSI);
+  HSZ atom = DdeCreateStringHandle(DDEIdInst, WXSTRINGCAST string, CP_WINANSI);
   wxAtomTable.Append(string, (wxObject *)atom);
   return atom;
 }
   wxAtomTable.Append(string, (wxObject *)atom);
   return atom;
 }
@@ -717,68 +736,68 @@ static HSZ DDEGetAtom(const wxString& string)
 
 void DDEPrintError(void)
 {
 
 void DDEPrintError(void)
 {
-  char *err = NULL;
+  wxChar *err = NULL;
   switch (DdeGetLastError(DDEIdInst))
   {
     case DMLERR_ADVACKTIMEOUT:
   switch (DdeGetLastError(DDEIdInst))
   {
     case DMLERR_ADVACKTIMEOUT:
-      err = "A request for a synchronous advise transaction has timed out.";
+      err = _T("A request for a synchronous advise transaction has timed out.");
       break;
     case DMLERR_BUSY:
       break;
     case DMLERR_BUSY:
-      err = "The response to the transaction caused the DDE_FBUSY bit to be set.";
+      err = _T("The response to the transaction caused the DDE_FBUSY bit to be set.");
       break;
     case DMLERR_DATAACKTIMEOUT:
       break;
     case DMLERR_DATAACKTIMEOUT:
-      err = "A request for a synchronous data transaction has timed out.";
+      err = _T("A request for a synchronous data transaction has timed out.");
       break;
     case DMLERR_DLL_NOT_INITIALIZED:
       break;
     case DMLERR_DLL_NOT_INITIALIZED:
-      err = "A DDEML function was called without first calling the DdeInitialize function,\n\ror an invalid instance identifier\n\rwas passed to a DDEML function.";
+      err = _T("A DDEML function was called without first calling the DdeInitialize function,\n\ror an invalid instance identifier\n\rwas passed to a DDEML function.");
       break;
     case DMLERR_DLL_USAGE:
       break;
     case DMLERR_DLL_USAGE:
-      err = "An application initialized as APPCLASS_MONITOR has\n\rattempted to perform a DDE transaction,\n\ror an application initialized as APPCMD_CLIENTONLY has \n\rattempted to perform server transactions.";
+      err = _T("An application initialized as APPCLASS_MONITOR has\n\rattempted to perform a DDE transaction,\n\ror an application initialized as APPCMD_CLIENTONLY has \n\rattempted to perform server transactions.");
       break;
     case DMLERR_EXECACKTIMEOUT:
       break;
     case DMLERR_EXECACKTIMEOUT:
-      err = "A request for a synchronous execute transaction has timed out.";
+      err = _T("A request for a synchronous execute transaction has timed out.");
       break;
     case DMLERR_INVALIDPARAMETER:
       break;
     case DMLERR_INVALIDPARAMETER:
-      err = "A parameter failed to be validated by the DDEML.";
+      err = _T("A parameter failed to be validated by the DDEML.");
       break;
     case DMLERR_LOW_MEMORY:
       break;
     case DMLERR_LOW_MEMORY:
-      err = "A DDEML application has created a prolonged race condition.";
+      err = _T("A DDEML application has created a prolonged race condition.");
       break;
     case DMLERR_MEMORY_ERROR:
       break;
     case DMLERR_MEMORY_ERROR:
-      err = "A memory allocation failed.";
+      err = _T("A memory allocation failed.");
       break;
     case DMLERR_NO_CONV_ESTABLISHED:
       break;
     case DMLERR_NO_CONV_ESTABLISHED:
-      err = "A client's attempt to establish a conversation has failed.";
+      err = _T("A client's attempt to establish a conversation has failed.");
       break;
     case DMLERR_NOTPROCESSED:
       break;
     case DMLERR_NOTPROCESSED:
-      err = "A transaction failed.";
+      err = _T("A transaction failed.");
       break;
     case DMLERR_POKEACKTIMEOUT:
       break;
     case DMLERR_POKEACKTIMEOUT:
-      err = "A request for a synchronous poke transaction has timed out.";
+      err = _T("A request for a synchronous poke transaction has timed out.");
       break;
     case DMLERR_POSTMSG_FAILED:
       break;
     case DMLERR_POSTMSG_FAILED:
-      err = "An internal call to the PostMessage function has failed. ";
+      err = _T("An internal call to the PostMessage function has failed. ");
       break;
     case DMLERR_REENTRANCY:
       break;
     case DMLERR_REENTRANCY:
-      err = "Reentrancy problem.";
+      err = _T("Reentrancy problem.");
       break;
     case DMLERR_SERVER_DIED:
       break;
     case DMLERR_SERVER_DIED:
-      err = "A server-side transaction was attempted on a conversation\n\rthat was terminated by the client, or the server\n\rterminated before completing a transaction.";
+      err = _T("A server-side transaction was attempted on a conversation\n\rthat was terminated by the client, or the server\n\rterminated before completing a transaction.");
       break;
     case DMLERR_SYS_ERROR:
       break;
     case DMLERR_SYS_ERROR:
-      err = "An internal error has occurred in the DDEML.";
+      err = _T("An internal error has occurred in the DDEML.");
       break;
     case DMLERR_UNADVACKTIMEOUT:
       break;
     case DMLERR_UNADVACKTIMEOUT:
-      err = "A request to end an advise transaction has timed out.";
+      err = _T("A request to end an advise transaction has timed out.");
       break;
     case DMLERR_UNFOUND_QUEUE_ID:
       break;
     case DMLERR_UNFOUND_QUEUE_ID:
-      err = "An invalid transaction identifier was passed to a DDEML function.\n\rOnce the application has returned from an XTYP_XACT_COMPLETE callback,\n\rthe transaction identifier for that callback is no longer valid.";
+      err = _T("An invalid transaction identifier was passed to a DDEML function.\n\rOnce the application has returned from an XTYP_XACT_COMPLETE callback,\n\rthe transaction identifier for that callback is no longer valid.");
       break;
     default:
       break;
     default:
-      err = "Unrecognised error type.";
+      err = _T("Unrecognised error type.");
       break;
   }
       break;
   }
-  MessageBox(NULL, (LPCSTR)err, "DDE Error", MB_OK | MB_ICONINFORMATION);
+  MessageBox((HWND) NULL, (LPCTSTR)err, _T("DDE Error"), MB_OK | MB_ICONINFORMATION);
 }
 
 #endif
 }
 
 #endif