2008-10-01 8 views

Répondre

11

Il y a la fonction GetCommandLine() dans l'API Win32. Sur d'autres plateformes, vous devriez sauvegarder argc/argv quelque part (variable externe?).

12

Sous Linux, le pseudo-fichier/proc/self/cmdline contient la ligne de commande du processus. Chaque argument est terminé avec un octet 0 et l'argument final est suivi d'un octet supplémentaire.

4

Je suggère que cela ressemble à une étrange situation. Etes-vous en train d'écrire un plugin ou quelque chose? Peut-être ne devriez-vous pas accéder à argv/argc?

+0

Je suis d'accord. Si une bibliothèque a besoin d'accéder à argv et argc, alors la bibliothèque pourrait probablement utiliser une nouvelle conception. – Landon

+1

GTK + a besoin (ou accepte, pas sûr) argc & argv pour analyser, disons, le paramètre --display. Cela pourrait être utile dans ce cas aussi; pense "--debug". – aib

+0

argv et argc sont passés à GTK + ce qui est parfaitement sensé. Ce dont je parlais - et ce que demande DanJ - était un moyen pour une bibliothèque d'accéder à argv et argc. – Landon

4

Sous Windows, vous pouvez utiliser GetCommandLine() pour obtenir un pointeur sur la ligne de commande, puis utiliser CommandLineToArgvW() pour convertir ce pointeur au format argv []. Cependant, il existe seulement une version large (Unicode).

0

Utilisez les commandes getpid() et ps.

int pid;

int fd;

char cmd [80];

pid = getpid(); Sprintf (cmd, "ps% d", pid)

sprintf (cmd, "ps% d", pid);

fd = popen (cmd, "r");

.... lignes devraient être comme

.... 1358 ./a.out abc def

5

Sur Windows, vous pouvez accéder argc/argv via __argc et __argv. __wargv si vous voulez la version à caractères larges.

+0

merci pour le __wargv – Martlark

+0

C'est une idée vraiment terrible! Tout symbole dont le nom commence par deux traits de soulignement est réservé à un usage interne par l'implémentation du compilateur. Vous devriez ___never___ se référer à ceux-ci dans le code d'utilisateur. Ceci est un exemple classique de comportement non défini auto-infligé - tout résultat (potentiellement indésirable) est possible. –

+0

Bon point! Je ne suis pas sûr de savoir pourquoi j'ai répondu à une question Windows. –

1

Sous Windows, j'utilise ce genre de chose pour obtenir les arguments:


#include <windows.h> 
#include <string> 
#include <vector> 
#include <cwchar> 
#include <cstdio> 
#include <clocale> 
using namespace std; 

vector<wstring> getArgs() { 
    int argc; 
    wchar_t** argv = CommandLineToArgvW(GetCommandLineW(), &argc); 
    vector<wstring> args; 
    if (argv) { 
     args.assign(argv, argv + argc); 
     LocalFree(argv); 
    } 
    return args; 
} 

int main() { 
    const vector<wstring> argv = getArgs(); 
    setlocale(LC_CTYPE, ".OCP"); 
    for (vector<wstring>::const_iterator i = argv.begin(); i != argv.end(); ++i) { 
     wprintf(L"%s\n", i->c_str()); 
    } 
} 

Edit: Une fonction de getArgs comme qui est également utile pour MinGW comme MinGW ne supporte pas wmain().

0

Avez-vous pensé à utiliser des variables d'environnement au lieu de la ligne de commande? Peut être plus facile pour l'utilisateur en fonction des types d'applications dans lesquelles la bibliothèque sera utilisée, et vous pouvez utiliser la fonction standard getenv().

Je pense, en tout cas, si votre bibliothèque va utiliser argc et argv, le programme devrait être celui de les passer.

1

Cela devrait fonctionner sous Linux:

#include <stdio.h> 
#include <unistd.h> 

void findargs(int *argc, char ***argv) { 
    size_t i; 
    char **p = &__environ[-2]; 
    for (i = 1; i != *(size_t*)(p-1); i++) { 
     p--; 
    } 
    *argc = (int)i; 
    *argv = p; 
} 

int main(int argc, char **argv) { 
    printf("got argc=%d, argv=%p\n", argc, argv); 
    findargs(&argc, &argv); 
    printf("found argc=%d, argv=%p\n", argc, argv); 
    return 0; 
} 

Note: échoue si setenv() a été appelé.

Questions connexes