X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0d7ea902499bf302628cc12aa4705fb162b6fefd..78316bbe3589b0d9bad4de1706d3e8a3215b0867:/src/msw/utilsexc.cpp diff --git a/src/msw/utilsexc.cpp b/src/msw/utilsexc.cpp index 5cbd5a4957..12a78c001a 100644 --- a/src/msw/utilsexc.cpp +++ b/src/msw/utilsexc.cpp @@ -74,6 +74,10 @@ #endif #include +#if wxUSE_IPC + #include "wx/dde.h" // for WX_DDE hack in wxExecute +#endif // wxUSE_IPC + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -175,11 +179,83 @@ LRESULT APIENTRY _EXPORT wxExecuteWindowCbk(HWND hWnd, UINT message, return DefWindowProc(hWnd, message, wParam, lParam); } } -#endif +#endif // Win32 -long wxExecute(const wxString& command, bool sync, wxProcess *handler) +long wxExecute(const wxString& cmd, bool sync, wxProcess *handler) { - wxCHECK_MSG( !!command, 0, wxT("empty command in wxExecute") ); + wxCHECK_MSG( !!cmd, 0, wxT("empty command in wxExecute") ); + + wxString command; +#if wxUSE_IPC + // DDE hack: this is really not pretty, but we need to allow this for + // transparent handling of DDE servers in wxMimeTypesManager. Usually it + // returns the command which should be run to view/open/... a file of the + // given type. Sometimes, however, this command just launches the server + // and an additional DDE request must be made to really open the file. To + // keep all this well hidden from the application, we allow a special form + // of command: WX_DDE::DDE_SERVER:DDE_TOPIC:DDE_COMMAND in which + // case we execute just and process the rest below + wxString ddeServer, ddeTopic, ddeCommand; + static const size_t lenDdePrefix = 7; // strlen("WX_DDE:") + if ( cmd.Left(lenDdePrefix) == _T("WX_DDE#") ) + { + const wxChar *p = cmd.c_str() + 7; + while ( *p && *p != _T('#') ) + { + command += *p++; + } + + if ( *p ) + { + // skip '#' + p++; + } + else + { + wxFAIL_MSG(_T("invalid WX_DDE command in wxExecute")); + } + + while ( *p && *p != _T('#') ) + { + ddeServer += *p++; + } + + if ( *p ) + { + // skip '#' + p++; + } + else + { + wxFAIL_MSG(_T("invalid WX_DDE command in wxExecute")); + } + + while ( *p && *p != _T('#') ) + { + ddeTopic += *p++; + } + + if ( *p ) + { + // skip '#' + p++; + } + else + { + wxFAIL_MSG(_T("invalid WX_DDE command in wxExecute")); + } + + while ( *p ) + { + ddeCommand += *p++; + } + } + else +#endif // wxUSE_IPC + { + // no DDE + command = cmd; + } #if defined(__WIN32__) && !defined(__TWIN32__) // the old code is disabled because we really need a process handle @@ -237,6 +313,7 @@ long wxExecute(const wxString& command, bool sync, wxProcess *handler) return result; #else // 1 + // create the process STARTUPINFO si; wxZeroMemory(si); @@ -338,6 +415,22 @@ long wxExecute(const wxString& command, bool sync, wxProcess *handler) return pi.dwProcessId; } +#if wxUSE_IPC + // second part of DDE hack: now establish the DDE conversation with the + // just launched process + if ( !!ddeServer ) + { + wxDDEClient client; + wxConnectionBase *conn = client.MakeConnection(_T(""), + ddeServer, + ddeTopic); + if ( !conn || !conn->Execute(ddeCommand) ) + { + wxLogError(_("Couldn't launch DDE server '%s'."), command.c_str()); + } + } +#endif // wxUSE_IPC + if ( !sync ) { // clean up will be done when the process terminates