[prev in list] [next in list] [prev in thread] [next in thread]
List: lyx-cvs
Subject: r34721 - lyx-devel/trunk/src/support
From: joost () lyx ! org
Date: 2010-06-28 17:45:05
Message-ID: 20100628174505.63CAF3087B () lyx ! lyx ! org
[Download RAW message or body]
Author: joost
Date: Mon Jun 28 19:45:04 2010
New Revision: 34721
URL: http://www.lyx.org/trac/changeset/34721
Log:
Launch external Windows processes for e.g. display image conversion using \
CreateProcess with a CREATE_NO_WINDOW flag, allowing LyX to be compiled as a GUI \
application without console windows popping up.
Modified:
lyx-devel/trunk/src/support/ForkedCalls.cpp
lyx-devel/trunk/src/support/filetools.cpp
Modified: lyx-devel/trunk/src/support/ForkedCalls.cpp
==============================================================================
--- lyx-devel/trunk/src/support/ForkedCalls.cpp Mon Jun 28 19:23:48 2010 (r34720)
+++ lyx-devel/trunk/src/support/ForkedCalls.cpp Mon Jun 28 19:45:04 2010 (r34721)
@@ -300,6 +300,9 @@
if (line.empty())
return 1;
+#if !defined (_WIN32)
+ // POSIX
+
// Split the input command up into an array of words stored
// in a contiguous block of memory. The array contains pointers
// to each word.
@@ -326,23 +329,11 @@
if (c == ' ')
*it = '\0';
else if (c == '\'' || c == '"') {
-#if defined (_WIN32)
- // How perverse!
- // spawnvp *requires* the quotes or it will
- // split the arg at the internal whitespace!
- // Make shure the quote is a DOS-style one.
- *it = '"';
-#else
*it = '\0';
-#endif
inside_quote = c;
}
} else if (c == inside_quote) {
-#if defined (_WIN32)
- *it = '"';
-#else
*it = '\0';
-#endif
inside_quote = 0;
}
}
@@ -370,9 +361,6 @@
lyxerr << "</command>" << endl;
}
-#ifdef _WIN32
- pid_t const cpid = spawnvp(_P_NOWAIT, argv[0], &*argv.begin());
-#else // POSIX
pid_t const cpid = ::fork();
if (cpid == 0) {
// Child
@@ -383,6 +371,24 @@
<< strerror(errno) << endl;
_exit(1);
}
+#else
+ // Windows
+
+ pid_t cpid = -1;
+
+ STARTUPINFO startup;
+ PROCESS_INFORMATION process;
+
+ memset(&startup, 0, sizeof(STARTUPINFO));
+ memset(&process, 0, sizeof(PROCESS_INFORMATION));
+
+ startup.cb = sizeof(STARTUPINFO);
+
+ if (CreateProcess(0, (LPSTR)line.c_str(), 0, 0, FALSE,
+ CREATE_NO_WINDOW, 0, 0, &startup, &process)) {
+ CloseHandle(process.hThread);
+ cpid = (pid_t)process.hProcess;
+ }
#endif
if (cpid < 0) {
@@ -571,6 +577,7 @@
} else {
actCall->setRetValue(exit_code);
}
+ CloseHandle(hProcess);
remove_it = true;
break;
}
@@ -578,6 +585,7 @@
lyxerr << "WaitForSingleObject failed waiting for child\n"
<< getChildErrorMessage() << endl;
actCall->setRetValue(1);
+ CloseHandle(hProcess);
remove_it = true;
break;
}
Modified: lyx-devel/trunk/src/support/filetools.cpp
==============================================================================
--- lyx-devel/trunk/src/support/filetools.cpp Mon Jun 28 19:23:48 2010 (r34720)
+++ lyx-devel/trunk/src/support/filetools.cpp Mon Jun 28 19:45:04 2010 (r34721)
@@ -39,6 +39,7 @@
#include <boost/regex.hpp>
#include <fcntl.h>
+#include <io.h>
#include <cerrno>
#include <cstdlib>
@@ -48,6 +49,10 @@
#include <fstream>
#include <sstream>
+#if defined (_WIN32)
+#include <windows.h>
+#endif
+
using namespace std;
#define USE_QPROCESS
@@ -766,7 +771,39 @@
// pstream (process stream), with the
// variants ipstream, opstream
-#if defined (HAVE_POPEN)
+#if defined (_WIN32)
+ int fno;
+ STARTUPINFO startup;
+ PROCESS_INFORMATION process;
+ SECURITY_ATTRIBUTES security;
+ HANDLE in, out;
+ FILE * inf = 0;
+
+ security.nLength = sizeof(SECURITY_ATTRIBUTES);
+ security.bInheritHandle = TRUE;
+ security.lpSecurityDescriptor = NULL;
+
+ if (CreatePipe(&in, &out, &security, 0)) {
+ memset(&startup, 0, sizeof(STARTUPINFO));
+ memset(&process, 0, sizeof(PROCESS_INFORMATION));
+
+ startup.cb = sizeof(STARTUPINFO);
+ startup.dwFlags = STARTF_USESTDHANDLES;
+
+ startup.hStdError = GetStdHandle(STD_ERROR_HANDLE);
+ startup.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
+ startup.hStdOutput = out;
+
+ if (CreateProcess(0, (LPTSTR)cmd.c_str(), &security, &security,
+ TRUE, CREATE_NO_WINDOW, 0, 0, &startup, &process)) {
+
+ CloseHandle(process.hThread);
+ fno = _open_osfhandle((long)in, _O_RDONLY);
+ CloseHandle(out);
+ inf = _fdopen(fno, "r");
+ }
+ }
+#elif defined (HAVE_POPEN)
FILE * inf = ::popen(cmd.c_str(), os::popen_read_mode());
#elif defined (HAVE__POPEN)
FILE * inf = ::_popen(cmd.c_str(), os::popen_read_mode());
@@ -787,7 +824,11 @@
c = fgetc(inf);
}
-#if defined (HAVE_PCLOSE)
+#if defined (_WIN32)
+ WaitForSingleObject(process.hProcess, INFINITE);
+ CloseHandle(process.hProcess);
+ int const pret = fclose(inf);
+#elif defined (HAVE_PCLOSE)
int const pret = pclose(inf);
#elif defined (HAVE__PCLOSE)
int const pret = _pclose(inf);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic