2

Windows サービスを作成するプログラムを作成しています。したがって、2 つの .exe ファイルが必要です。1 つはサービスを作成するプログラム用で、もう 1 つはサービス自体用です。しかし、これら 2 つのファイルを 1 つに結合したいと考えています。私は次のアイデアを持っています.exeファイルをテキストエディタでパックし(サービスアプリケーション)、その内容を文字列にコピーします。次に、必要なディレクトリに空の .exe ファイルを作成し、このファイルに文字列を書き込む必要があります。しかし、それは良い考えではないと思います。私の問題を解決する最善の方法は何ですか?

前もって感謝します。

4

2 に答える 2

2

楽しみのために、あなたの方法を使用する「ランチャー」プログラムを作成しました。動作します。ペイロードとして zoomin.exe を使用してテストしました。

ランチャー実行可能ファイルを作成したら、それとペイロード ファイル (私の場合は zoomin.exe) の両方をNotepad++で開き、コピーします ([編集 | 形式を選択して貼り付け | バイナリ コンテンツのコピー] および [バイナリ コンテンツの貼り付け] メニュー オプションを使用)。

Notepad++ で "File Goes Here" と "End" を検索すると、ランチャー ファイル内のペイロードの場所を見つけることができます。

これは決してお勧めしません。面倒でエラーが発生しやすく、さまざまなコンパイラ設定で簡単に壊れる可能性があることに注意してください。私が過去にこれを解決した方法は、すでにコメントしたように、ペイロードをリソースとして追加することであり、これははるかに保守しやすいものです。

#include <stdio.h>

#define SIZE_OF_ZOOMIN_EXE 11264
char buffer[SIZE_OF_ZOOMIN_EXE] = "File Goes Here";
char end_of_buffer[] = "End";

int main()
{
    FILE *fp = fopen("myzoomin.exe", "wb");
    fwrite(buffer, sizeof(buffer), 1, fp);
    fclose(fp);
    return 0;
}

これは、私が C++ で書いた自己インストール サービスの main() 関数です。さらに、このプログラムでは、サービスを対話的に実行できます。

int main( int argc, char *argv[] ) 
{ 
    SERVICE_TABLE_ENTRY   DispatchTable[] = 
    { 
        { SERVICE_NAME,      Eng3ServiceStart      }, 
        { NULL,              NULL          } 
    }; 

    try {
        if (argc >= 2) {
            if (argc >= 3)
                if (!(logfile = fopen(argv[2], "a")))
                    logfile = stdout;

            if (0 == _stricmp(argv[1], "install")) {
                DeleteEng3Service(); // ignore return value -- don't care if error
                return CreateEng3Service();
            }
            else if (0 == _stricmp(argv[1], "uninstall"))
                return DeleteEng3Service() ;

        } 

        // not installing or uninstalling, start the service,
        // passing it all the command-line arguments.
        if (!StartServiceCtrlDispatcher( DispatchTable ) ) {
            if (GetLastError() == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) {
                fprintf(logfile, "Failed to connect to service. Starting in console mode.\n");
                return svcmain(argc, argv);
            }
            throw sys_ex();
        }

    } catch (exception& ex ) {
        fprintf(logfile, ex.what());
    }
} 
于 2012-10-08T18:47:04.803 に答える
1

win32実行可能ファイルへのリソースとしてバイナリデータを追加できるはずです。

win32リソース関数を使用すると、これは実行可能であるはずです。

グーグルはこれを持ち出しました:http://www.codeproject.com/Articles/4221/Adding-and-extracting-binary-resources

于 2012-10-11T14:52:39.017 に答える