2010-07-05 100 views
1

最近我試圖通過創建一個額外的(的DLLMain)入口點,已經有一個主入口點的應用程序單元測試添加到現有的二進制文件(這是一個控制檯EXE)。該應用程序似乎編譯正確,雖然我無法使用它作爲一個DLL從我的Python單元測試框架,所有嘗試使用exe作爲DLL失敗。多個應用程序的入口點

有沒有人在增加額外的應用程序入口點與任一輸入,爲什麼這會或不會工作的任何想法或經驗?

回答

3

有,你要解決實現你想要的一些問題:

  • EXE文件必須重定位表(使用鏈接器開關/ FIXED:NO)
  • 的EXE必須出口至少一個功能 - 很清楚如何做到這一點。

我推薦使用不帶開關(/ headers,/ exports和without switches)的DUMPBIN.EXE來檢查exe頭文件。您可以將應用程序的結構與導出某些函數的Winword.exe或outlook.exe進行比較。

如果這一切都不會有幫助,我會嘗試編寫一個測試EXE應用程序,它可以作爲exe加載並在此處發佈代碼。

修訂:剛纔驗證了我的建議。有用。文件Loadable.c看起來像下面

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

EXTERN_C int __declspec(dllexport) WINAPI Sum (int x, int y); 

EXTERN_C int __declspec(dllexport) WINAPI Sum (int x, int y) 
{ 
    return x + y; 
} 

int main() 
{ 
    printf ("2+3=%d\n", Sum(2,3)); 
} 

唯一重要的鏈接器開關是/FIXED:NO哪一個可以在連接設置的高級部分找到。該程序可以運行並生成輸出「2+3=5」。

另一個EXE加載的EXE作爲DLL並調用Sum功能:

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

typedef int (WINAPI *PFN_SUM) (int x, int y); 

int main() 
{ 
    HMODULE hModule = LoadLibrary (TEXT("C:\\Oleg\\ExeAsDll\\Loadable.exe")); 
    PFN_SUM fnSum = (PFN_SUM) GetProcAddress (hModule, "[email protected]"); 
    int res = fnSum (5,4); 
    printf ("5+4=%d\n", res); 
    return 0; 
} 

該程序也可以運行和產生的輸出 「5+4=9」。

1

我不知道肯定,但我猜的Windows只是拒絕加載過程中的一個EXE和DLL中的新工藝,簡單明瞭。

這些問題似乎包含更多細節:

在一個可執行圖像來獲得這兩個行爲的最簡單的方法是將其設計爲一個DLL,然後使用rundll32.exe獨立執行。沒有必要編寫自己的包裝器。

相關問題