2016-09-28 94 views
0

我想隐藏我的EXE文件,它是VB代码,所以我想我可以但它在一个VC++代码中,然后我可以从VC++代码调用它,如运行(myfile.exe)或执行(myfile.exe)。 但我不知道如何将它添加到VC++中!如何在VC++ EXE程序中嵌入一个EXE文件

+0

有什么建议? –

+0

我的答案解决了你的问题吗? – CristiFati

回答

3

你可以使用Resources

有2个阶段,你需要的工作:

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

    #include <stdio.h> 
    #include <Windows.h> 
    #include "res.h" 
    
    #define STRINGIFY(X) #X 
    #define QUOTE(X) STRINGIFY(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; 
    } 
    
+0

能否请你通过链接向我发送源代码和文件,我将不胜感激 –

+1

嗯,我不知道该怎么做。但是你需要做的就是创建我枚举的3个文件,并复制/粘贴我发布的相应代码块。 – CristiFati

+0

只需使用Dropbox或谷歌驱动器上传 –

相关问题