C语言如何实现一个“替身”程序
“替身”的例子
用Windows的朋友通常会装一个Git for Windows。
在Git for Windows的程序目录下有 cmd\git.exe
和 bin\git.exe
这两个相同的文件,它们只有几十KB大小,并不是真正的git.exe,只是一个替身,而真身在 mingw64\bin\git.exe
,当替身被客户程序(比如TortoiseGit)调用时,替身就会去调用真身,并向客户程序返回正确的结果。
上一张示意图:
而我的问题就是想实现一个上面所说的替身,但是Git for Windows的仓库并没有提供这个文件的源码。于是我自己写了一个,代码如下:
相关代码
// git.c
#include <stdio.h>
#include <windows.h>
#define GIT_PATH "C:\\devtools\\Git\\mingw64\\bin\\git.exe"
void get_args(int argc, char *argv[], char *args); // 命令行参数转字符串
int main(int argc, char *argv[]) {
// 获取参数字符串
char args[8191 - MAX_PATH];
get_args(argc, argv, args);
// 把git.exe路径和参数args拼接成cmd命令
char cmd[8191];
strcpy(cmd, GIT_PATH);
strcpy(cmd + strlen(cmd), args);
// 调用系统命令执行
return system(cmd);
}
void get_args(int argc, char *argv[], char *args) {
args[0] = '\0';
for (int n = 1; n < argc; n++) {
strcpy(args + strlen(args), " ");
strcpy(args + strlen(args), argv[n]);
}
}
运行结果
将上述代码编译,执行结果如下:
在Windows命令行调用上述代码时可以正常看到执行结果
被TortoiseGit调用时报错
提问
问题出在哪?如何才能实现像cmd\git.exe
那样完美的替身?
我是C语言和Windows编程的新手,谢谢大牛们解答!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
system
EXM?https://zh.cppreference.com/w/c/program/system
https://docs.microsoft.com/zh-cn/cpp/c-runtime-library/exec-wexec-functions?view=vs-2019
http://man7.org/linux/man-pages/man3/exec.3.html