35 votes

Quel est l'équivalent de Posix popen() dans l'API Win32?

Y a-t-il un équivalent approximatif de la fonction popen() de stdio.h de Linux/Unix dans l'API Win32? Si oui, où puis-je le trouver?

Édition: J'ai besoin de savoir cela pour corriger une omission dans la bibliothèque standard D. Toute réponse doit utiliser uniquement l'API standard Win32, pas de fonctions spécifiques à MSVC. De plus, je préférerais quelque chose qui ne soit pas horriblement bas niveau, s'il existe.

27voto

Johannes Schaub - litb Points 256113

MSDN explique comment faire ce que fait popen en utilisant l'API Windows dans Héritage de la poignée du tuyau. Ici il fournit un exemple bien documenté. C'est beaucoup plus bas niveau que la fonction _popen trouvée dans la bibliothèque d'exécution liée par Jason, mais utilise exclusivement l'API Win32.

22voto

Jason Coco Points 52303

Vous pouvez appeler _popen si vous écrivez une application console. Pour plus d'informations, consultez la documentation sur le site MSDN : http://msdn.microsoft.com/en-us/library/96ayss4b(VS.80).aspx

3voto

MarkR Points 37178

Malheureusement, ce n'est pas particulièrement facile.

Vous devez créer un tube en utilisant la fonction win32 (CreatePipe), puis généralement vous devez dupliquer l'extrémité du tube (DuplicateHandle) que vous donnez au sous-processus pour permettre son héritage, sinon il ne le sera pas et ne pourra donc pas être utilisé.

Ensuite, vous devez créer un processus en utilisant CreateProcess (qui prend beaucoup de pointeurs de structure, y compris un STARTUPINFO), et passer dans le STARTUPINFO la poignée que vous avez dupliquée en tant que sortie standard.

Ensuite, vous pouvez lire à partir de l'extrémité de lecture du tube (ReadFile, etc.) jusqu'à ce que vous atteigniez la fin de fichier, puis vous devez nettoyer en fermant toutes les différentes poignées win32.

3voto

RJVB Points 46

Déterrer un vieux fil de discussion...

En réaction à la réponse de Jason Coco ci-dessus, et contrairement à ce que prétend la page MSDN liée, il est apparemment possible de nos jours d'appeler _popen() depuis des applications non console. Je l'appelle depuis un composant importateur QuickTime, essentiellement une DLL déguisée. Il ouvre une fenêtre de console mais montre par ailleurs le comportement attendu. En compilant un outil console standard avec l'option -mwindows de mingw32 pour en faire une application GUI, _popen continue de fonctionner correctement (mais une fenêtre de console s'ouvre même lorsque l'outil est exécuté à partir d'une autre console.

1voto

ryyker Points 3662

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X