Red de conocimiento del abogados - Preguntas y respuestas sobre la Ley de patentes - Lenguaje C, cómo transferir datos a un "archivo EXE externo llamado"

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") ;

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 ))

{

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);

CloseHandle(pi.hProcess);

CloseHandle(pi.hThread

}