visual如何从库函数访问c++中的argc和argv
visual How can I access argc and argv in c++ from a library function
我正在编写一个要在C++中动态加载的库。
我想从代码中读取argc和argv(出于调试原因),但我无法访问主函数。有没有任何方法可以检索命令行(Windows和Linux解决方案都很好)。
谢谢,Dan
Win32 API中有GetCommandLine()函数。在其他平台上,您必须将argc/argv保存在某个位置(外部变量?)。
在Linux上,伪文件/proc/self/cmdline保存进程的命令行。每个参数都以一个0字节结束,最后一个参数后面跟着一个额外的0字节。
在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"%sn", 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=%pn", argc, argv);
findargs(&argc, &argv);
printf("found argc=%d, argv=%pn", 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,那么程序应该是传递它们的程序。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- .cpp和.h文件中的模板专用化声明
- 反向给定链表中的K节点
- 正在查找文档以获得PS4平台的C++中的设备信息
- enum是C++中的宏变量还是整数变量
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 将字符串存储在c++中的稳定内存中
- 文本文件中的单词链表
- 递归函数计算序列中的平方和(并输出过程)
- 如何从C++中的依赖类型中获得它所依赖的类型
- C++中的"inline"关键字
- 函数main中的参数argv(int argc,char *argv [])
- argc C++中的argv参数(游戏编程)
- 我如何在框架中找到ARGC的地址
- 绕过 SDL2 中的"int main(int argc, char** argv)"
- 当 * 作为调用 C 中的程序的参数之一传递时,argc 的值
- GTEST_API_ int main(int argc, char **argv){}中的GTEST_API_是什么?
- 在constexpr中使用argc,是否严格要求所涉及的任何子表达式都是常量表达式
- 如果我使用一个结构体来携带argc和argv,我如何将地址argv赋值给结构体中的变量?
- visual如何从库函数访问c++中的argc和argv