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

liyi
  • 4
新手上路,请多包涵

“替身”的例子

用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编程的新手,谢谢大牛们解答!

回复
阅读 1.3k
宣传栏