如何从库函数访问C ++中的argc和argv
我正在编写一个库,该库将在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,则该程序应该是传递它们的程序。