J'essaie d'appeler popen () à l'aide de Mingw comme ceci: mais je ne peux pas le faire fonctionner.
Je pense que c'est un cauchemar Citant ... P> p>
5 Réponses :
Selon la page d'homme de Popen:
L'argument de commande est un pointeur à un String null terminé contenant un ligne de commande shell. Cette commande est passé à / bin / sh à l'aide du drapeau -c; interprétation, le cas échéant, est effectué par la coquille. P> blockQuote>
Alors ce que vous voulez, c'est d'échapper à la chaîne pour
sh code> pour analyser. Vous n'avez pas besoin d'échapper à l'argument code> code>, et vous pouvez essayer d'échapper aux espaces au lieu de cibler le nom du programme complet. Je n'ai pas de système Windows ici pour tester avec mais je vous suggérerais p>
xxx pré> p>
Gardez à l'esprit que c'est Mingw, cependant, donc je ne sais pas que popen code> transmet la commande à / bin / sh. Pourrait-il y passer à un autre plus de shell de Windows-Y et moins de Posix-y à la place? Celui qui interprétera ces titulaires du dos en tant que séparateurs de chemins plutôt que de s'échapper et qui auront ses propres règles de citation.
Jetez un coup d'œil à Quelle est l'équivalent à Posix Popen dans l'API Win32 em> . J'ai abandonné ma tentative d'utiliser Si MINGW transmettez vos paramètres sur _popen () code> sous Windows il y a longtemps. La solution pure Win32 fonctionne beaucoup plus de manière fiable.
SH -C code> au lieu de
cmd.exe / c code>, alors vous voulez probablement changer ces backslashes pour transférer des barres obliques. Quelque chose comme ce qui suit devrait faire l'affaire. P>
Un programme compilé par MINGW n'a pas de _popen code> qui transmet des paramètres à
sh -c code>; Il est lié à une bibliothèque Windows interne appelée
msvcrt.dll code> dont
_popen code> ne fait certainement aucune chose. La bibliothèque de MSYS de Mingw (utilisée par la boîte à outils elle-même) a probablement un
popen code> qui appelle
sh code>. La DLL Cygwin le fait et MSYS est un dérivé de cygwin. Lorsque vous construisez des programmes avec Mingw, ils ne sont pas liés avec des MSYS.
Ce problème s'avère être résoluble. (Bien que, comme avec la plupart des choses sous Windows, pas 100%).
La fonction code> popen code> ouvre une commande système, ce qui signifie qu'il s'agit presque certainement de prendre l'argument de la chaîne et de l'interpoler dans cmd.exe / c après une certaine expérimentation interactive avec tentative naïf avec des citations, Nope: p> pouvez-nous échapper aux devis avec le circonflexe? Qu'en est-il de l'espace? p> cmd.exe / c code> à l'invite de commande Windows, nous avons frappé une manière Pour exécuter un programme qui a des espaces dans son chemin de chemin. p>
#include <stdio.h>
int main()
{
FILE *in = _popen("C:\\Program\" \"Files\\Internet\" \"Explorer\\iexplore.exe", "r");
if (in) {
char line[200];
printf("successfully opened!\n");
if (fgets(line, 200, in))
fputs(line, stdout);
_pclose(in);
}
return 0;
}
J'étais juste face à ce problème et j'ai essayé la solution de Kaz sans succès. La façon dont j'ai résolu était simplement de changer de répertoire, exécuter _popen sans le chemin d'accès à l'exécutable, puis remplacez-le sur le répertoire d'origine.
char cwd[MAX_PATH]; _getcwd(cwd, MAX_PATH); if (_chdir("C:\\Program Files\\CA\\BrightStor ARCserve Backup") >= 0) { outputPointer = _popen("ca_qmgr.exe \"-list\"", "r"); _chdir(cwd); }
Il allume la fonction popen bandes les guillemets autour du tout, par exemple. Cette solution a été inspirée par la réponse de Kaz em> p> "C: / Program Files" Code> devient
C: / Program Files CODE> et
"AB CD.EXE" "EF GH" CODE> devient
AB CD "" EF GH code>. Vous pouvez contourner cela en ajoutant simplement des guillemets autour du tout, par exemple.
"" AB CD.EXE "" EF GH "" code> qui devient
"AB CD.exe" "EF GH" code> comme prévu. P>
Sa semble stupide que cela fonctionnerait ... mais quand j'ai essayé tout mon citant a soudainement commencé à travailler ...
Vous avez demandé à cela autour du temps que j'ai fait les premières rejets publics d'un langage de programmation que j'ai commencé à travailler, il y a presque six ans! J'ai rencontré et j'ai résolu cette question dans le port Windows d'une fonction de bibliothèque de cette langue, qui est maintenant dans sa 105ème version publique. Fondamentalement, j'augmente l'ouverture d'un processus avec une liste d'arguments, mais à l'aide de la fonction
popen code> dans Mingw (qui correspond à la bibliothèque d'exécution Microsoft C
_popen code>) qui signifie que je dois coder soigneusement le nom du processus et les cordes d'argumentation. Donc, il y a votre réponse.