]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/dde.cpp
Don't use DDEExec registry key in wxMSW wxExecute() if it's empty.
[wxWidgets.git] / src / msw / dde.cpp
index 20bbe4bb239c542667674b5f828a1127a6c85114..f11a8492085e8e39121d1abee56194fac6cd5df9 100644 (file)
@@ -4,7 +4,6 @@
 // Author:      Julian Smart
 // Modified by:
 // Created:     01/02/97
-// RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -139,7 +138,7 @@ private:
 
 IMPLEMENT_DYNAMIC_CLASS(wxDDEServer, wxServerBase)
 IMPLEMENT_DYNAMIC_CLASS(wxDDEClient, wxClientBase)
-IMPLEMENT_CLASS(wxDDEConnection, wxConnectionBase)
+IMPLEMENT_DYNAMIC_CLASS(wxDDEConnection, wxConnectionBase)
 IMPLEMENT_DYNAMIC_CLASS(wxDDEModule, wxModule)
 
 // ============================================================================
@@ -160,7 +159,7 @@ extern void wxDDEInitialize()
         UINT rc = DdeInitialize(&DDEIdInst, callback, APPCLASS_STANDARD, 0L);
         if ( rc != DMLERR_NO_ERROR )
         {
-            DDELogError(_T("Failed to initialize DDE"), rc);
+            DDELogError(wxT("Failed to initialize DDE"), rc);
         }
         else
         {
@@ -174,7 +173,7 @@ void wxDDECleanUp()
     // deleting them later won't work as DDE won't be initialized any more
     wxASSERT_MSG( wxDDEServerObjects.empty() &&
                     wxDDEClientObjects.empty(),
-                    _T("all DDE objects should be deleted by now") );
+                    wxT("all DDE objects should be deleted by now") );
 
     wxAtomTable.clear();
 
@@ -327,7 +326,6 @@ wxDDEServer::~wxDDEServer()
     {
         wxDDEConnection *connection = node->GetData();
         wxDDEConnectionList::compatibility_iterator next = node->GetNext();
-        connection->SetConnected(false);
         connection->OnDisconnect(); // May delete the node implicitly
         node = next;
     }
@@ -539,7 +537,7 @@ bool wxDDEConnection::Disconnect()
     bool ok = DdeDisconnect(GetHConv()) != 0;
     if ( !ok )
     {
-        DDELogError(_T("Failed to disconnect from DDE server gracefully"));
+        DDELogError(wxT("Failed to disconnect from DDE server gracefully"));
     }
 
     SetConnected( false );  // so we don't try and disconnect again
@@ -554,7 +552,7 @@ wxDDEConnection::DoExecute(const void *data, size_t size, wxIPCFormat format)
                  format == wxIPC_UTF8TEXT ||
                  format == wxIPC_UNICODETEXT,
                  false,
-                 _T("wxDDEServer::Execute() supports only text data") );
+                 wxT("wxDDEServer::Execute() supports only text data") );
 
     wxMemoryBuffer buffer;
     LPBYTE realData = NULL;
@@ -581,7 +579,7 @@ wxDDEConnection::DoExecute(const void *data, size_t size, wxIPCFormat format)
     if ( conv )
     {
         const char * const text = (const char *)data;
-        const size_t len = size/sizeof(char);
+        const size_t len = size;
 
         realSize = conv->ToWChar(NULL, 0, text, len);
         if ( realSize == wxCONV_FAILED )
@@ -594,6 +592,10 @@ wxDDEConnection::DoExecute(const void *data, size_t size, wxIPCFormat format)
         realSize = conv->ToWChar((wchar_t *)realData, realSize, text, len);
         if ( realSize == wxCONV_FAILED )
             return false;
+
+        // We need to pass the size of the buffer to DdeClientTransaction() and
+        // not the length of the string.
+        realSize *= sizeof(wchar_t);
     }
 #else // !wxUSE_UNICODE
     if ( format == wxIPC_UNICODETEXT )
@@ -605,7 +607,7 @@ wxDDEConnection::DoExecute(const void *data, size_t size, wxIPCFormat format)
         // we could implement this in theory but it's not obvious how to pass
         // the format information and, basically, why bother -- just use
         // Unicode build
-        wxFAIL_MSG( _T("UTF-8 text not supported in ANSI build") );
+        wxFAIL_MSG( wxT("UTF-8 text not supported in ANSI build") );
 
         return false;
     }
@@ -624,7 +626,7 @@ wxDDEConnection::DoExecute(const void *data, size_t size, wxIPCFormat format)
         if ( realSize == wxCONV_FAILED )
             return false;
 
-        realData = (LPBYTE)buffer.GetWriteBuf(realSize*sizeof(char));
+        realData = (LPBYTE)buffer.GetWriteBuf(realSize);
         if ( !realData )
             return false;
 
@@ -636,7 +638,7 @@ wxDDEConnection::DoExecute(const void *data, size_t size, wxIPCFormat format)
 
     DWORD result;
     bool ok = DdeClientTransaction(realData,
-                                   realSize*sizeof(wxChar),
+                                   realSize,
                                    GetHConv(),
                                    NULL,
                                    // MSDN: if the transaction specified by
@@ -649,7 +651,7 @@ wxDDEConnection::DoExecute(const void *data, size_t size, wxIPCFormat format)
 
     if ( !ok )
     {
-        DDELogError(_T("DDE execute request failed"));
+        DDELogError(wxT("DDE execute request failed"));
     }
 
     return ok;
@@ -669,7 +671,7 @@ const void *wxDDEConnection::Request(const wxString& item, size_t *size, wxIPCFo
                                                   &result);
     if ( !returned_data )
     {
-        DDELogError(_T("DDE data request failed"));
+        DDELogError(wxT("DDE data request failed"));
 
         return NULL;
     }
@@ -678,7 +680,7 @@ const void *wxDDEConnection::Request(const wxString& item, size_t *size, wxIPCFo
 
     void *data = GetBufferAtLeast(len);
     wxASSERT_MSG(data != NULL,
-                 _T("Buffer too small in wxDDEConnection::Request") );
+                 wxT("Buffer too small in wxDDEConnection::Request") );
     (void) DdeGetData(returned_data, (LPBYTE)data, len, 0);
 
     (void) DdeFreeDataHandle(returned_data);
@@ -845,7 +847,7 @@ _DDECallback(WORD wType,
 
                     void *data = connection->GetBufferAtLeast(len);
                     wxASSERT_MSG(data != NULL,
-                                 _T("Buffer too small in _DDECallback (XTYP_EXECUTE)") );
+                                 wxT("Buffer too small in _DDECallback (XTYP_EXECUTE)") );
 
                     DdeGetData(hData, (LPBYTE)data, len, 0);
 
@@ -926,7 +928,7 @@ _DDECallback(WORD wType,
 
                     void *data = connection->GetBufferAtLeast(len);
                     wxASSERT_MSG(data != NULL,
-                                 _T("Buffer too small in _DDECallback (XTYP_POKE)") );
+                                 wxT("Buffer too small in _DDECallback (XTYP_POKE)") );
 
                     DdeGetData(hData, (LPBYTE)data, len, 0);
 
@@ -1013,7 +1015,7 @@ _DDECallback(WORD wType,
 
                     void *data = connection->GetBufferAtLeast(len);
                     wxASSERT_MSG(data != NULL,
-                                 _T("Buffer too small in _DDECallback (XTYP_ADVDATA)") );
+                                 wxT("Buffer too small in _DDECallback (XTYP_ADVDATA)") );
 
                     DdeGetData(hData, (LPBYTE)data, len, 0);
 
@@ -1063,9 +1065,9 @@ The returned handle has to be freed by the caller (using
 */
 static HSZ DDEAtomFromString(const wxString& s)
 {
-    wxASSERT_MSG( DDEIdInst, _T("DDE not initialized") );
+    wxASSERT_MSG( DDEIdInst, wxT("DDE not initialized") );
 
-    HSZ hsz = DdeCreateStringHandle(DDEIdInst, (wxChar*)s.wx_str(), DDE_CP);
+    HSZ hsz = DdeCreateStringHandle(DDEIdInst, wxMSW_CONV_LPTSTR(s), DDE_CP);
     if ( !hsz )
     {
         DDELogError(_("Failed to create DDE string"));
@@ -1105,7 +1107,7 @@ static void DDELogError(const wxString& s, UINT error)
         error = DdeGetLastError(DDEIdInst);
     }
 
-    wxLogError(s + _T(": ") + DDEGetErrorMsg(error));
+    wxLogError(s + wxT(": ") + DDEGetErrorMsg(error));
 }
 
 static wxString DDEGetErrorMsg(UINT error)