2016-09-28 23 views
0

exeファイルを非表示にしたいのですが、VBコードなので、VC++のコードの中に入れてVC++のコードから呼び出せます(myfile.exe)またはexecute(myfile.exe)を実行します。 しかし、VC++の中にどのように追加することはできません!VC++のexeプログラムにEXEファイルを埋め込むにはどうすればいいですか?

+0

どのような提案ですか? –

+0

私の答えはあなたの問題を解決しましたか? – CristiFati

答えて

3

Resourcesを使用するとできます。

あなたが作業する必要がある2つの段階があります。

  • ビルド時間:あなたのC++アプリケーションを構築するとき、あなたは(埋め込み)を含むようにVisual Studioのを指示する必要がありVB実行ファイルが(リソースとしてresource.exe)をプロジェクト出力(それが生成する実行可能ファイルC++実行可能ファイル)に指定しました。 (もちろん)、そのためには、ビルド時にVB実行可能ファイルを持っている必要があり
  • 実行時間:あなたのC++アプリケーションは、自分自身からリソースを取得し、ファイルに保存し、それを実行できなければなりません。

私がテストした(動作している)プロトタイプです。両方によって含まれる定数の定義を持つだけで、ファイル -

  • res.h:あなたは(私はバージョン10.0を使用しています(2010))あなたのVStudioでプロジェクトを含める必要がある3つのファイルがあります。他のファイル。 ヘッダーファイルの下に含めます。

    #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またはGoogleドライブ –

関連する問題