Lenguaje C, cómo transferir datos a un "archivo EXE externo llamado"
Me pregunto si le importaría usar una canalización (anónima) para implementarlo. A través de su función de dirección, puede obtener fácilmente el resultado del programa que realiza la llamada e interactuar con él. La función CreatePipe en msdn proporciona un ejemplo de esto.
Hay otro ejemplo, escrito cuando escribí el complemento bcb ddkbuild para compilar el controlador:
void __fastcall BuildAndMessage(AnsiString PathToBuild/*=NULL*/, AnsiString Set/*=NULL*/)
{
AnsiString CommandStr = MakeCommandStr(PathToBuild, Set);
//ShowMessage(CommandStr);
//Leer canalización
HANDLE hChildStdinWr/*proceso padre escribe*/, hChildStdinRd/*proceso hijo lee*/;
// escribe canalización
HANDLE hChildStdoutWr/*proceso hijo escribe */, hChildStdoutRd/*Proceso principal leído*/;
SECURITY_ATTRIBUTES sa;
_di_IOTAMessageServices MessageServices;
_di_IOTAMessageGroup MessageGroup;
if (BorlandIDEServices- >Supports(MessageServices))
{
MessageServices->ClearToolMessages(NULL);
MessageGroup = MessageServices->AddMessageGroup("Ddkbuild") ; p>
MessageServices->ShowMessageView(MessageGroup);
}
else
{
ShowMessage(" Error al crear ddkbuild messageview");
return;
}
sa.bInheritHandle = true;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
// Crear canal de escritura de subproceso
if (!CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &sa, 0 )) p>
{
ShowMessage("Error al crear la tubería Stdout");
return;
}
SetHandleInformation(hChildStdoutRd, HANDLE_FLAG_INHERIT, 0); // Este identificador no es utilizado por el proceso hijo, por lo que la herencia se cancela
// Crea una canalización de lectura para el proceso hijo
if (!CreatePipe(&hChildStdinRd, &hChildStdinWr, &sa,0))
{
ShowMessage("Error al crear la tubería StdinRd");
return;
}
SetHandleInformation(hChildStdinWr, HA
NDLE_FLAG_INHERIT, 0); // Este identificador no es utilizado por el proceso hijo, por lo que la herencia se cancela
//SetStdHandle(STD_OUTPUT_HANDLE, hChildStdoutWr);
//SetStdHandle(STD_INPUT_HANDLE , hChildStdinRd) ;
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si. cb = sizeof (STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.hStdInput = hChildStdinRd; Entrada del proceso redirector
si.hStdOutput = hChildStdoutWr; // Redirigir la salida del proceso hijo
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
// Tenga en cuenta el uso de verdadero, de modo que cuando se crea un proceso hijo, todos los identificadores heredables del proceso padre puedan heredarse
// También podemos usar SetHandleInformation para hacer que el identificador no sea heredable, de modo que el proceso hijo no pueda Úselo
// Para ver un ejemplo de este tipo, consulte "Creación de un proceso secundario con entrada y salida redirigidas.doc"
if (!CreateProcess(NULL, CommandStr.c_str() , NULL, NULL, true, 0, NULL, NULL, &si, &pi))
{
ShowMessage("Error al crear el proceso");
return ;
}
// Escribe datos en el proceso hijo, esto es solo una demostración, este programa no necesita escribir
const char *strIn = " ";
DWORD dwBytes = 0;
WriteFile(hChildStdinWr, strIn, strlen(strIn), &dwBytes, NULL);
CloseHandle(hChildStdinWr); // Asegúrese de que el ReadFile del par pueda regresar
// ReadFile debe cerrarse antes de llamar; de lo contrario, debido a que hay un identificador de escritura abierto en el extremo de escritura del canal de escritura, ReadFile no puede devolver 0 al final
CloseHandle(hChildStdoutWr);
// Lea los resultados de la ejecución del proceso secundario y no procese mbcs Amigos que lo necesiten, agregue el carácter principal para juzgar
char strData[MAX_PATH * 2]
AnsiString MessageComplete, MessageCut;
char* pos;
char lf = '\n';
void* No utilizado = 0;
while (ReadFile(hChildStdoutRd, strData, sizeof(strData),
&dwBytes, NULL))
{
strData[dwBytes] = 0;
if (pos = strrchr(strData, lf)) // Si hay una nueva línea, luego mostrar
{
*(pos-1) = 0;
pos++;
MessageComplete = MessageCut + strData ;
MessageCut = pos;
MessageServices->AddToolMessage(
"", MessageComplete, "Ddkbuild", 0, 0, NULL, No utilizado, MessageGroup) ;
}
else // De lo contrario, almacenamiento temporal
MessageCut = MessageCut + strData;
Aplicación->ProcessMessages();
}
MessageServices->AddToolMessage(
"", MessageCut, "Ddkbuild", 0, 0, NULL, Unused, MessageGroup);
// Cerrar el identificador
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(hChildStdinRd);
CloseHandle(hChildStdoutRd); p>
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread
}