Как я могу получить доступ к argc и argv в c ++ из библиотечной функции - PullRequest
9 голосов
/ 02 октября 2008

Я пишу библиотеку, которая должна быть динамически загружена в C ++.

Я бы хотел прочитать argc и argv (по причинам отладки) из моего кода, однако у меня нет доступа к основной функции. Есть ли способ получить командную строку (было бы неплохо как для Windows, так и для Linux).

Спасибо, Dan

Ответы [ 10 ]

12 голосов
/ 02 октября 2008

В Linux псевдо-файл / proc / self / cmdline содержит командную строку для процесса. Каждый аргумент завершается байтом 0, а за последним аргументом следует дополнительный байт 0.

11 голосов
/ 02 октября 2008

В Win32 API есть функция GetCommandLine (). На других платформах вам нужно было бы где-нибудь сохранить argc / argv (внешняя переменная?).

5 голосов
/ 02 октября 2008

В Windows вы можете получить доступ к argc / argv через __argc и __argv. __wargv, если вы хотите широкоформатную версию.

5 голосов
/ 02 октября 2008

В этой теме показано, как это сделать в Linux.

http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.system/2005-07/0147.html

4 голосов
/ 02 октября 2008

В Windows вы можете использовать GetCommandLine () для получения указателя на командную строку, а затем использовать CommandLineToArgvW () для преобразования этого указателя в формат argv []. Однако доступна только широкая (Unicode) версия.

4 голосов
/ 02 октября 2008

Могу ли я предположить, что это звучит как странная ситуация. Вы пишете плагин или что-то? Возможно, вам не следует обращаться к argv / argc?

1 голос
/ 21 декабря 2012

Это должно работать под 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;
}

Примечание. Сбой при вызове setenv ().

1 голос
/ 02 октября 2008

В Windows я использую этот тип вещей, чтобы получить аргументы:


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

Редактировать: подобная функция getArgs также полезна для mingw, поскольку mingw не поддерживает wmain ().

0 голосов
/ 02 октября 2008

Задумывались ли вы об использовании переменных среды вместо командной строки? Может быть проще для пользователя в зависимости от того, в каких приложениях будет использоваться библиотека, и вы можете использовать стандартную функцию getenv ().

Я думаю, в любом случае, если ваша библиотека будет использовать argc и argv, программа должна быть той, которая передает их.

0 голосов
/ 02 октября 2008

Используйте команды getpid () и ps.

int pid;

int fd;

char cmd [80];

pid = getpid ();

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

fd = popen (cmd, "r");

.... строки должны быть как

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...