如何在 VC++ exe 程序中嵌入 EXE 文件

Posted

技术标签:

【中文标题】如何在 VC++ exe 程序中嵌入 EXE 文件【英文标题】:How can I embed an EXE File inside a VC++ exe program 【发布时间】:2016-09-28 13:23:41 【问题描述】:

我想隐藏我的 exe 文件,它是 VB 代码,所以我想我可以,但它在 vc++ 代码中,然后我可以从 VC++ 代码中调用它,例如 run(myfile.exe) 或 execute(myfile.exe) . 但我不知道如何在 VC++ 中添加它!

【问题讨论】:

【参考方案1】:

你可以使用[MS.Docs]: Introduction to Resources来做到这一点。

您需要完成两个阶段:

构建时间:在构建您的C++应用程序时,您必须指示VStudio包含(嵌入)VB可执行文件(我将其命名为resource.exe)作为资源进入项目输出(C++它生成的可执行文件); (当然)为此,您需要在构建时拥有 VB 可执行文件 运行时间:您的 C++ 应用程序必须能够从自身获取资源,将其保存到文件中并执行

这是一个我测试过的原型(它可以工作)。您需要在 VStudio 10.0 (2010) 项目中包含 3 个文件:

res.h - 只是一个包含常量定义的文件,其他两个文件都包含。将其包含在头文件

#define EXE_NAME "resource.exe"
#define RES_TYPE_UNQUOTED RAW
#define RES_NAME_UNQUOTED EXECUTABLE

exe.rc - 这是资源文件(尽可能简化)。将其包含在资源文件下。 注意:尝试从 VStudio 编辑它会失败,因为资源编辑器希望文件包含一些废话(默认情况下由 VStudio 插入)。

#include "res.h"
RES_NAME_UNQUOTED RES_TYPE_UNQUOTED EXE_NAME

main.c - 主代码文件。将其包含在 Source Files 下。它从自身加载资源,将其保存到文件中,然后尝试执行该文件。我使用注释代码进行调试,不再需要它,但我还是把它留在那里。 注意这只是一个例子,代码可以写得更好(例如在错误处理、资源组织等方面),我专注于让某些东西工作。

#include <stdio.h>
#include <Windows.h>
#include "res.h"

#define _QUOTE(X) #X
#define QUOTE(X) _QUOTE(X)
#define RES_TYPE QUOTE(RES_TYPE_UNQUOTED)
#define RES_NAME QUOTE(RES_NAME_UNQUOTED)

/*
#define NULL_STR "null"

BOOL CALLBACK EnumResNameProc(_In_opt_ HMODULE hModule, _In_ LPCTSTR lpszType, _In_ LPTSTR lpszName, _In_ LONG_PTR lParam) 
    if (IS_INTRESOURCE(lpszName))
        printf("    ResourceName(int): [%d]\n", lpszName);
    else 
        printf("    ResourceName(str): [%s]\n", lpszName ? lpszName : NULL_STR);
        printf("    Resource addr: %08X\n", (long)FindResource(NULL, lpszName, lpszType));
    
    return TRUE;


BOOL CALLBACK EnumResTypeProc(_In_opt_ HMODULE hModule, _In_ LPTSTR lpszType, _In_ LONG_PTR lParam) 
    if (IS_INTRESOURCE(lpszType))
        printf("  ResourceType(int): [%d]\n", lpszType);
    else
        printf("  ResourceType(str): [%s]\n", lpszType ? lpszType : NULL_STR);
    EnumResourceNames(NULL, lpszType, EnumResNameProc, lParam);
    return TRUE;

//*/

int main() 
    HANDLE fp = NULL;
    HRSRC res = NULL;
    HGLOBAL global = NULL;
    char *buf = NULL;
    DWORD size = 0, written = 0;
    int ret = -1;

/*
    EnumResourceTypes(NULL, EnumResTypeProc, NULL);
    printf("[%s][%s]\n", RES_NAME, RES_TYPE);
//*/
    if ((res = FindResource(NULL, RES_NAME, RES_TYPE)) == NULL) 
        printf("FindResource error: %d\n", GetLastError());
        return 1;
    
    if ((global = LoadResource(NULL, res)) == NULL) 
        printf("LoadResource error: %d\n", GetLastError());
        return 2;
    
    if ((size = SizeofResource(NULL, res)) == 0) 
        printf("SizeofResource error: %d\n", GetLastError());
        return 3;
    
    if ((buf = (char*)LockResource(global)) == NULL) 
        printf("LockResource error: %d\n", GetLastError());
        return 4;
    
    if ((fp = CreateFile(EXE_NAME, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL , NULL)) == INVALID_HANDLE_VALUE) 
        printf("CreateFile error: %d\n", GetLastError());
        return 5;
    
    if (WriteFile(fp, buf, size, NULL, NULL) == FALSE) 
        printf("WriteFile error: %d\n", GetLastError());
        CloseHandle(fp);
        return 5;
    
    CloseHandle(fp);
    ret = system(EXE_NAME);
    printf("system returned %d\n", ret);
    return 0;

【讨论】:

能否请您通过链接将源代码和文件发给我,我将不胜感激 嗯,我不知道该怎么做。但是您需要做的就是创建我列举的 3 个文件,然后复制/粘贴我发布到其中的相应代码块。 好的,对于 Dropbox,我必须下载一个时髦的应用程序,我不想这样做,对于 Google Drive,我需要一些联系方式来分享。 请通过电子邮件发送。 moneejkoo3@gmail.com 我发现这是一个错字。反正我发了。

以上是关于如何在 VC++ exe 程序中嵌入 EXE 文件的主要内容,如果未能解决你的问题,请参考以下文章

在VC中 可以直接调用资源中的EXE文件吗?

如何将附属程序集嵌入到 EXE 文件中

vc中如何将dll件和exe编译成一个exe文件?

如何在单个 EXE 中嵌入多语言 *.resx(或 *.resources)文件?

如何在单个EXE中嵌入多语言* .resx(或* .resources)文件?

用vc6.0编译出的exe如何提取源代码?