Я не мог понять, почему popen / pclose отсутствует в Codeblocks / MinGW. Поэтому я работал над проблемой, используя вместо этого CreateProcess () и CreatePipe (). Вот решение, которое сработало для меня:
//C++11
#include <cstdio>
#include <iostream>
#include <windows.h>
#include <cstdint>
#include <deque>
#include <string>
#include <thread>
using namespace std;
int SystemCapture(
string CmdLine, //Command Line
string CmdRunDir, //set to '.' for current directory
string& ListStdOut, //Return List of StdOut
string& ListStdErr, //Return List of StdErr
uint32_t& RetCode) //Return Exit Code
{
int Success;
SECURITY_ATTRIBUTES security_attributes;
HANDLE stdout_rd = INVALID_HANDLE_VALUE;
HANDLE stdout_wr = INVALID_HANDLE_VALUE;
HANDLE stderr_rd = INVALID_HANDLE_VALUE;
HANDLE stderr_wr = INVALID_HANDLE_VALUE;
PROCESS_INFORMATION process_info;
STARTUPINFO startup_info;
thread stdout_thread;
thread stderr_thread;
security_attributes.nLength = sizeof(SECURITY_ATTRIBUTES);
security_attributes.bInheritHandle = TRUE;
security_attributes.lpSecurityDescriptor = nullptr;
if (!CreatePipe(&stdout_rd, &stdout_wr, &security_attributes, 0) ||
!SetHandleInformation(stdout_rd, HANDLE_FLAG_INHERIT, 0)) {
return -1;
}
if (!CreatePipe(&stderr_rd, &stderr_wr, &security_attributes, 0) ||
!SetHandleInformation(stderr_rd, HANDLE_FLAG_INHERIT, 0)) {
if (stdout_rd != INVALID_HANDLE_VALUE) CloseHandle(stdout_rd);
if (stdout_wr != INVALID_HANDLE_VALUE) CloseHandle(stdout_wr);
return -2;
}
ZeroMemory(&process_info, sizeof(PROCESS_INFORMATION));
ZeroMemory(&startup_info, sizeof(STARTUPINFO));
startup_info.cb = sizeof(STARTUPINFO);
startup_info.hStdInput = 0;
startup_info.hStdOutput = stdout_wr;
startup_info.hStdError = stderr_wr;
if(stdout_rd || stderr_rd)
startup_info.dwFlags |= STARTF_USESTDHANDLES;
// Make a copy because CreateProcess needs to modify string buffer
char CmdLineStr[MAX_PATH];
strncpy(CmdLineStr, CmdLine.c_str(), MAX_PATH);
CmdLineStr[MAX_PATH-1] = 0;
Success = CreateProcess(
nullptr,
CmdLineStr,
nullptr,
nullptr,
TRUE,
0,
nullptr,
CmdRunDir.c_str(),
&startup_info,
&process_info
);
CloseHandle(stdout_wr);
CloseHandle(stderr_wr);
if(!Success) {
CloseHandle(process_info.hProcess);
CloseHandle(process_info.hThread);
CloseHandle(stdout_rd);
CloseHandle(stderr_rd);
return -4;
}
else {
CloseHandle(process_info.hThread);
}
if(stdout_rd) {
stdout_thread=thread([&]() {
DWORD n;
const size_t bufsize = 1000;
char buffer [bufsize];
for(;;) {
n = 0;
int Success = ReadFile(
stdout_rd,
buffer,
(DWORD)bufsize,
&n,
nullptr
);
printf("STDERR: Success:%d n:%d\n", Success, (int)n);
if(!Success || n == 0)
break;
string s(buffer, n);
printf("STDOUT:(%s)\n", s.c_str());
ListStdOut += s;
}
printf("STDOUT:BREAK!\n");
});
}
if(stderr_rd) {
stderr_thread=thread([&]() {
DWORD n;
const size_t bufsize = 1000;
char buffer [bufsize];
for(;;) {
n = 0;
int Success = ReadFile(
stderr_rd,
buffer,
(DWORD)bufsize,
&n,
nullptr
);
printf("STDERR: Success:%d n:%d\n", Success, (int)n);
if(!Success || n == 0)
break;
string s(buffer, n);
printf("STDERR:(%s)\n", s.c_str());
ListStdOut += s;
}
printf("STDERR:BREAK!\n");
});
}
WaitForSingleObject(process_info.hProcess, INFINITE);
if(!GetExitCodeProcess(process_info.hProcess, (DWORD*) &RetCode))
RetCode = -1;
CloseHandle(process_info.hProcess);
if(stdout_thread.joinable())
stdout_thread.join();
if(stderr_thread.joinable())
stderr_thread.join();
CloseHandle(stdout_rd);
CloseHandle(stderr_rd);
return 0;
}
int main()
{
int rc;
uint32_t RetCode;
string ListStdOut;
string ListStdErr;
cout << "STARTING.\n";
rc = SystemCapture(
"C:\\Windows\\System32\\ipconfig.exe", //Command Line
".", //CmdRunDir
ListStdOut, //Return List of StdOut
ListStdErr, //Return List of StdErr
RetCode //Return Exit Code
);
if (rc < 0) {
cout << "ERROR: SystemCapture\n";
}
cout << "STDOUT:\n";
cout << ListStdOut;
cout << "STDERR:\n";
cout << ListStdErr;
cout << "Finished.\n";
cout << "Press Enter to Continue";
cin.ignore();
return 0;
}
Я ничего не знаю об отличном так в некотором смысле, я квалифицировал для ответа на это...
Я хотел бы Вас к:
Я не уверен в том, как Java6, пишущий сценарий поддержки, работает, но я абсолютно уверен, что это может быть сделано безопасным. Я помню что-то об определении API, который может использовать сценарий, прежде чем это будет выполнено.
Если это верно, затем примером, который Вы могли показать, будет некоторое приложение толстого клиента (например, аудиоплеер), где пользователи могут записать свои собственные сценарии с API, Вы обеспечиваете их в Groovy, который позволяет им писать сценарий своего приложения интересными и безопасными способами (например, создающий пользовательские столбцы в плей-листе)
Я пошел бы для:
Я упомянул бы следующие вещи в дополнение к тому, что было уже указано:
Одна вещь, которую мне нравится делать с Groovy, реализует интерфейс, определенный в Java как карта от имен методов до закрытий. Это - прохладная вещь, которую можно сделать с Groovy, но вероятно далеко за пределами вводной презентации все же.
Включайте пример того, как создание Java кодировать более отличный устраняет так много кода. Ожидайте их для собирания их челюстей от пола перед продолжением. У Scott Davis есть простой пример в начале Рецептов Groovy, который проводит 35 строк Java или 3 строки Groovy.
Необходимо определенно показать им, как создать быстрое приложение Grails. Два доменных класса, которые связаны. Создайте основное Приложение типа CRUD. Объясните, что таблицы составляются негласно с помощью GORM (В спящем режиме). Затем объясните, что можно создать военный файл и развернуть его, поскольку Вы были бы любой другой военный файл Java. Можно также добавить Grails/Groovy к существующему проекту Java/JSP, таким образом, он не требует огромного обязательства или изменения парадигмы.
Groovy/Grails является просто Ruby/направляющие для людей Java. Я покрыл бы плагины для Netbeans/Eclipse также. Groovy/Grails сейчас получает полную поддержку в главном IDE.
Наконец, если можно найти хорошую схему, которая показывает, как Grails создается сверху Spring, Будьте в спящем режиме, Кварц, Sitemesh и Groovy, я думаю, что люди поймут, что существует сокровищница, ожидающая, чтобы быть разблокированной.
[Больше комментария, чем ответ] Les, Хорошо сделанный на презентации Groovy. Прохождение через него напомнило мне о дюжине функций Groovy, что я забыл о. (Я довольно хорош в Groovy, но это настолько богато с функциями...), я собираюсь использовать Ваши слайды презентации как карты флэш-памяти, пока я не изучаю все это.Спасибо.
вот недавняя презентация отличных и чаш Грааля, который кажется представительным: http://jshingler.blogspot.com/2009/01/codemash-2009-groovy-and-grails.html