如何在 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 文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在单个 EXE 中嵌入多语言 *.resx(或 *.resources)文件?