Как получить доступ к argc и argv в c++ из библиотечной функции

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

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

спасибо, Дэн!--1-->

10 ответов


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

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


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


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


в windows вы можете получить доступ к argc / argv через _ _ argc и __argv. __wargv, если вы хотите широкую версию символов.


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


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


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

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


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


используйте 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


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

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