C语言如何实现一个“替身”程序

发布于 2022-09-11 23:01:58 字数 1521 浏览 45 评论 0

“替身”的例子

用Windows的朋友通常会装一个Git for Windows。

在Git for Windows的程序目录下有 cmd\git.exebin\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调用时报错
TortoiseGit调用

提问

问题出在哪?如何才能实现像cmd\git.exe那样完美的替身?

我是C语言和Windows编程的新手,谢谢大牛们解答!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文