Как получить доступ к 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, программа должна быть одна, чтобы пройти их.