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

时间:2016-09-28 13:23:41

标签: visual-c++

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

1 个答案:

答案 0 :(得分:3)

您可以使用[MS.Docs]: Introduction to Resources

您需要处理两个阶段:

  • 构建时间:构建 C ++ 应用程序时,必须指示 VStudio 包含(嵌入) VB 可执行文件(我将其命名为< em> 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 - 主要代码文件。将其包含在源文件下。它从自身加载资源,将其保存到文件中,然后尝试执行该文件。我使用注释代码进行调试,不再需要了,但我还是把它留在了那里。 注意这只是一个例子,代码可以写得更好(例如错误处理,资源组织......),我专注于有一些工作。

    #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;
    }