Domanda

Sto scrivendo una libreria che deve essere caricata dinamicamente in C ++.

Mi piacerebbe leggere argc e argv (per motivi di debug) all'interno del mio codice, tuttavia non ho accesso alla funzione principale. Esiste un modo per recuperare la riga di comando (sia la soluzione Windows che Linux sarebbe piacevole).

Grazie, Dan

È stato utile?

Altri suggerimenti

Su Linux lo pseudo-file / proc / self / cmdline contiene la riga di comando per il processo. Ogni argomento termina con uno 0 byte e l'argomento finale è seguito da uno 0 byte aggiuntivo.

Esiste la funzione GetCommandLine () nell'API Win32. Su altre piattaforme, dovresti salvare argc / argv da qualche parte (variabile esterna?).

Su Windows puoi accedere ad argc / argv tramite __argc e __argv. __wargv se vuoi la versione con caratteri ampi.

Posso suggerire che questa sembra una situazione strana. Stai scrivendo un plugin o qualcosa del genere? Forse non dovresti accedere ad argv / argc?

In Windows è possibile utilizzare GetCommandLine () per ottenere un puntatore alla riga di comando e quindi utilizzare CommandLineToArgvW () per convertire quel puntatore nel formato argv []. Tuttavia, è disponibile solo una versione larga (Unicode).

Su Windows, utilizzo questo tipo di cose per ottenere gli argomenti:


#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());
    }
}

Modifica: una funzione getArgs del genere è utile anche per mingw poiché mingw non supporta un wmain ().

Questo dovrebbe funzionare su 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;
}

Nota: fallisce se è stato chiamato setenv ().

Usa getpid () e il comando ps.

int pid;

int fd;

char cmd [80];

pid = getpid ();

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

fd = popen (cmd, " r ");

.... le linee dovrebbero essere come

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

Hai pensato di usare le variabili d'ambiente invece della riga di comando? Potrebbe essere più facile per l'utente a seconda del tipo di applicazioni in cui verrà utilizzata la libreria e puoi usare la funzione standard getenv ().

Penso, in ogni caso, se la tua libreria utilizzerà argc e argv, il programma dovrebbe essere quello per passarli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top