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

时间:2020-03-06 15:00:14  来源:igfitidea点击:

我正在编写一个库,该库将在C ++中动态加载。

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

谢谢,

解决方案

Win32 API中有GetCommandLine()函数。在其他平台上,我们必须将argc / argv保存在某个地方(外部变量?)。

在Linux上,伪文件/ proc / self / cmdline保存该进程的命令行。每个自变量以0字节结尾,最后一个自变量后跟一个添加的0字节。

此线程显示了如何在Linux上执行此操作。

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

我是否可以认为这听起来很奇怪。我们在编写插件或者其他东西吗?也许我们不应该访问argv / argc?

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

使用getpid()和ps命令。

int pid;

int fd;

字符cmd [80];

pid = getpid();

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

fd = popen(cmd," r");

....线应该像

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

在Windows上,我们可以通过__argc和__argv访问argc / argv。
__wargv(如果需要宽字符版本)。

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

我们是否考虑过使用环境变量而不是命令行?用户可能会更轻松,具体取决于将在哪种类型的应用程序中使用该库,并且我们可以使用标准的getenv()函数。

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