2012-10-08 37 views
2

我正在編寫一個程序,它創建Windows服務。所以我需要兩個.exe文件 - 一個用於程序,創建服務,另一個用於服務本身。但我想將這兩個文件合併爲一個。我有以下想法 - 打開.exe文件,我想在文本編輯器中打包(服務應用程序),然後將其內容複製到某個字符串中。然後,我需要在所需的目錄中創建一個空的.exe文件,並將字符串寫入此文件。但我想這不是一個好主意。解決我的問題的最佳方法是什麼?ANSI C:如何包含然後在我的應用程序中提取.exe文件(將.exe文件打包到.exe中)?

在此先感謝。

+1

使用Windows服務安裝程序? –

+1

複製到文本編輯器是最糟糕的想法。它不會保留非ASCII字符。無論如何,可執行文件不是原始機器碼,連接兩個文件將無法工作。 – 2012-10-08 18:20:14

+3

嗯,首先,ANSI C並不知道.exe文件是什麼。 Visual Studio編譯器(大概是其他的)可以讓你將資源打包到你的結果可執行文件中,這樣你就可以將一個包含你需要的exe的壓縮文件解壓到你運行的exe文件中。儘管我仍然不太明白你想要做什麼。 – Cubic

回答

2

爲了好玩,我寫了一個使用你的方法的「啓動器」程序。它的工作原理,我用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()); 
    } 
} 
+0

非常感謝這樣詳細的答案。儘管我已經使用Visual Studio中的資源編寫了我的程序(這很容易),但我認爲你的答案對未來的某些人有用:-) –

相關問題