2011-02-17 56 views
1

我會解釋我想要的,然後我會解釋我如何實現它。我想知道我是否正確地對待這種方式,或者是否有更簡單的方法。Make Custom Self-Extractor

我想要的是什麼:一個自解壓縮的可執行文件還有一個額外的入口點(這使得可執行文件適合可用,就像它是DLL一樣)。附加入口點必須是而不是是壓縮有效載荷的部分。奇怪的是,切入點不會執行任何LZMA功能(請不要問爲什麼......長故事)。僅供參考:使用DLL入口點製作可執行文件是一件微不足道的事情 - 我已經知道如何做到這一點。

我是如何追求這個的:我已經下載了LZMA SDK,並將構建自己的C++自解壓器。似乎沒有LZMA API文檔。不過,如果我想學習如何使用LZMA,我必須閱讀。\ C \ util \ 7z \ 7zmain.c或。\ cpp \ 7zip \ bundles \ lzmaCon \ lzmaAlone.cpp。我不知道學習這些是否是最快的學習工具。

一旦我創建了自解壓代碼,那麼我將添加我需要和構建的DLL入口點。生成的EXE自解壓器將與zip文件連接(DOS命令應該足以連接兩個文件)。這應該達到我的目標。

想法?

p.s.順便說一句,我在今年已經部分完成了。我製作了一個自解壓程序(用C#編寫)可執行文件,然後將其與zip文件(通過DOS命令)連接起來。 Voila,一個自解壓zip可執行文件出現了。什麼讓我目前的努力不同的是,現在我正在使用C++,並且我需要這個額外的/任意的DLL入口點。

回答

0

爲什麼將兩種功能混淆在一起?你爲什麼不製作一個dll和使用它的可執行文件。

+0

我的最終結果必須是單個可執行文件,而不是可執行文件加上DLL。 – 2011-02-17 21:56:13

0

您可以看看NSIS如何創建LZMA自提取器。那麼你可以用DLL入口點來擴展它。

或者,也許你可以使用NSIS腳本來生成自解壓器並使用它們的腳本語言來創建DLL條目。

0

至於以.exe導出函數,它不是一個問題顯然, 我想這和它的工作(使用/ FIXED編譯:NO鏈接器選項, 然後複製可執行文件2.exe,然後嘗試運行原可執行文件和2.exe)

#include <stdio.h> 
#include <windows.h> 

//#pragma comment(linker,"/FIXED:NO") 

extern "C" 
__declspec(dllexport) 
void __cdecl func(void) { 
    int a; 
    __asm { 
    call m0 
    m0: pop a 
    } 
    printf("dll func! @ %08X\n", a); 
} 

typedef void (*__cdecl pfunc)(void); 

int main(void) { 

    HMODULE h = LoadLibrary("2.exe"); 
    printf("h=%08X\n", h); 

    void* p = GetProcAddress(h, "func"); 
    printf("p=%08X\n", p); 

    pfunc f = pfunc(p); 
    f(); 

} 

至於LZMA,其還少的問題,嘗試尋找這個http://nishi.dreamhosters.com/u/lzma.rar如果原始源似乎過於複雜 (lzmadec.c)

我不相當理解附加zip文件的想法......你的意思是.zipx 與lzma壓縮?或者,也許你真的需要看看zlib?