楽しみのために、あなたの方法を使用する「ランチャー」プログラムを作成しました。動作します。ペイロードとして 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());
}
}