如何从库函数访问c ++中的argc和argv

时间:2008-10-01 23:56:56

标签: c++ visual-c++ gcc

我正在编写一个用C ++动态加载的库。

我想从我的代码中读取argc和argv(出于调试原因),但是我无法访问main函数。有没有办法检索命令行(Windows和Linux解决方案都很好)。

谢谢, 丹

10 个答案:

答案 0 :(得分:12)

在Linux上,伪文件/ proc / self / cmdline保存进程的命令行。每个参数以0字节结束,最后一个参数后跟一个额外的0字节。

答案 1 :(得分:11)

Win32 API中有GetCommandLine()函数。在其他平台上,你必须在某处保存argc / argv(外部变量?)。

答案 2 :(得分:5)

答案 3 :(得分:5)

在Windows上,您可以通过__argc和__argv访问argc / argv。 __wargv如果你想要宽字符版本。

答案 4 :(得分:4)

我可以建议这听起来像一个奇怪的情况。你在写插件还是什么?也许你不应该访问argv / argc?

答案 5 :(得分:4)

在Windows中,您可以使用GetCommandLine()获取指向命令行的指针,然后使用CommandLineToArgvW()将该指针转换为argv []格式。但是,只有一个广泛的(Unicode)版本可供使用。

答案 6 :(得分:1)

在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()。

答案 7 :(得分:1)

这应该在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(),则会失败。

答案 8 :(得分:0)

使用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

答案 9 :(得分:0)

您是否考虑过使用环境变量而不是命令行?用户可能更容易,具体取决于库的使用类型,您可以使用标准的getenv()函数。

我认为,无论如何,如果您的图书馆要使用argc和argv,程序应该是传递它们的程序。