我正在編寫一個程序,它創建Windows服務。所以我需要兩個.exe文件 - 一個用於程序,創建服務,另一個用於服務本身。但我想將這兩個文件合併爲一個。我有以下想法 - 打開.exe文件,我想在文本編輯器中打包(服務應用程序),然後將其內容複製到某個字符串中。然後,我需要在所需的目錄中創建一個空的.exe文件,並將字符串寫入此文件。但我想這不是一個好主意。解決我的問題的最佳方法是什麼?ANSI C:如何包含然後在我的應用程序中提取.exe文件(將.exe文件打包到.exe中)?
在此先感謝。
我正在編寫一個程序,它創建Windows服務。所以我需要兩個.exe文件 - 一個用於程序,創建服務,另一個用於服務本身。但我想將這兩個文件合併爲一個。我有以下想法 - 打開.exe文件,我想在文本編輯器中打包(服務應用程序),然後將其內容複製到某個字符串中。然後,我需要在所需的目錄中創建一個空的.exe文件,並將字符串寫入此文件。但我想這不是一個好主意。解決我的問題的最佳方法是什麼?ANSI C:如何包含然後在我的應用程序中提取.exe文件(將.exe文件打包到.exe中)?
在此先感謝。
爲了好玩,我寫了一個使用你的方法的「啓動器」程序。它的工作原理,我用zoomin.exe作爲有效載荷進行測試。
一旦你創建了啓動程序的可執行文件,在Notepad++中同時打開它和有效載荷文件(在我的情況下爲zoomin.exe),並複製(使用編輯|選擇性粘貼|複製二進制內容和粘貼二進制內容菜單選項)。
通過在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());
}
}
非常感謝這樣詳細的答案。儘管我已經使用Visual Studio中的資源編寫了我的程序(這很容易),但我認爲你的答案對未來的某些人有用:-) –
應該可以將二進制數據作爲resouce添加到win32可執行文件。使用win32 resource functions這應該是可行的。
谷歌搜索提出了這個:http://www.codeproject.com/Articles/4221/Adding-and-extracting-binary-resources
使用Windows服務安裝程序? –
複製到文本編輯器是最糟糕的想法。它不會保留非ASCII字符。無論如何,可執行文件不是原始機器碼,連接兩個文件將無法工作。 – 2012-10-08 18:20:14
嗯,首先,ANSI C並不知道.exe文件是什麼。 Visual Studio編譯器(大概是其他的)可以讓你將資源打包到你的結果可執行文件中,這樣你就可以將一個包含你需要的exe的壓縮文件解壓到你運行的exe文件中。儘管我仍然不太明白你想要做什麼。 – Cubic