2010-03-22 195 views
1

在編譯期間,有沒有辦法將現有的.exe文件與其他C++源文件鏈接起來?我實際上想要做的是使用LZMA(7zip)SDK在我的控制檯程序中壓縮和解壓縮一些文件,但不幸的是它很難用於新手。將現有的exe文件嵌入到另一個程序中

有一個名爲7za.exe的命令行版本的LZMA,我想知道是否我可以以某種方式將它嵌入到我的程序中,並像使用函數一樣使用它。它可以很容易地與system()函數一起使用(這似乎是一個非常危險的使用),但如果我將程序發送給沒有正確文件夾中的7za.exe的人,它將無法工作。

我在Windows.h頭文件中遇到了CreateProcess()函數,但它似乎以更合適和更高級的方式實現了system()。我不知道,如果它實際上可以鏈接編譯

+0

如果您要求使用鏈接器如MS link.exe或GNU的ld進行鏈接,那麼不可以。這與C++無關。 – 2010-03-22 23:55:44

+1

您正在使用壓縮SDK進入正確的軌道。不要爲此使用外部exe文件。請發佈您使用7zip的問題。 – kervin 2010-03-23 00:01:52

回答

3

CreateProcess()中像一個對象文件中的exe文件是Windows API調用來啓動一個進程,正是因爲它聽起來像,作爲你的程序的孩子,你可以通過知道它的控制HANDLEsystem()執行系統命令。這與你所知道的一樣多,我個人不惜一切代價避免使用它 - 不僅是因爲它不是可移植的(該功能存在於Windows和Linux上,但命令不會)。

可以將數據附加到EXE映像的末尾 - 這是安裝程序的工作方式。看看這個microsoft support article,它奇怪地給你基本的代碼,但你應該能夠把它變成C++。這裏有一篇關於creating a self-extractor的文章,可能更適合。兩者都應該允許你在exe文件中嵌入文件。

我不建議你提取7za並從System()CreateProcess()調用它 - 我建議你學習SDK。這很困難,但你會從中學到很多東西。

最後,因爲您必須修改現有的exe文件,您將無法在編譯時執行此操作。您需要將代碼添加到自己的圖像或其他圖像。

有關addressing data的更多詳細信息附加到exe。

1

好了,試試這個...

  1. 寫命令行實用程序,只是將文件複製到另一個終點。你可以用Windows文件I/O或shell命令來做到這一點。
  2. 進行後期構建步驟以運行此實用程序。您的程序將完全鏈接通常的方式,然後您的實用程序將僅將第二個exe的字節附加到目標exe。

這是連接步驟。現在運行時訪問exe是另一回事。本質上,算法是這樣的:

  1. 打開EXE嵌入到一個字節級別的二進制編輯器(msdev.exe會這樣做)。記下前30或40個字節作爲文件開頭的唯一標記。
  2. 編寫一個函數,用於打開上面創建的複合文件,並通過查找唯一標記來搜索嵌入文件。
  3. 一旦找到嵌入文件的開頭,使用文件I/O將該文件的字節複製到第二個新文件。
  4. 使用system()或類似的API執行新文件。

如果您以這種方式分發別人的工作,請獲得正確的許可。一般來說,將其他人的二進制文件放入你自己的版本中是有侵犯版權的 - 當然也有例外。