2016-09-28 137 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或谷歌驅動器上傳 –

相關問題