Ceci est un ancien message, mais j'ai également eu besoin il y a plusieurs années d'utiliser un appel similaire à popen() dans un environnement Windows. Comme plusieurs commentaires dans la réponse ici l'ont noté, l'utilisation de l'API Windows pour implémenter quelque chose d'approchant du classique popen()
POSIX est intéressante.
J'ai créé une implémentation que j'ai soumise à Code Review. Cette implémentation utilise des tuyaux
pour stdin
et stdout
, ainsi que des méthodes Windows pour CreateProcess(...)
.
Le code lié est conçu pour être incorporé dans une dll avec une API très réduite.
int __declspec(dllexport) cmd_rsp(const char *command, char **chunk, unsigned int size);
Exemple simple d'utilisation:
#include "cmd_rsp.h"
int main(void)
{
char *buf = {0};
buf = calloc(100, 1);
if(!buf)return 0;
cmd_rsp("dir /s", &buf, 100);
printf("%s", buf);
free(buf);
//ou un exécutable personnalisé
char *buf2 = {0};
buf2 = calloc(100, 1);
cmd_rsp("some_custom_program.exe arg_1 arg_2 arg_n", &buf2, 100);
printf("%s", buf2);
free(buf2);
return 0;
}
Il prend n'importe quelle commande qui peut par exemple être émise depuis stdin
, crée un processus séparé pour exécuter la commande, puis renvoie tout le contenu de réponse (s'il y en a) dans un tampon, et ce sans afficher la fenêtre CMD. Le tampon s'agrandit au besoin pour accommoder la taille de la réponse.