2011-04-20 42 views
2

我有Program A(它是開源的,但我不能修改它的源代碼)和DLL B,它是動態加載的Program A在加載器中定義的C++動態dll加載和函數

有沒有辦法,使用Program A中定義的功能DLL B

(可能有助於; Program A有很多的.h頭文件,我需要的所有功能都在這...定義extern

回答

0

器extern定義生成可以在A.exe時鏈接使用符號。當你想獲得符號的地址(函數,變量,...)時,必須導出該符號。這通常不是爲一個程序完成的。

如果你的程序A.exe時不提供您的指針或手段來得到一個指向一個功能,您將無法使用該程序A.exe時的功能,在您的DLL B.

骯髒的黑客雖然...

+0

您是什麼樣的骯髒的黑客? – krisy 2011-04-20 11:22:37

+0

類似於從映射文件中獲取函數的地址,將此硬編碼分配給DLL B中的函數指針,並祈禱總是調用相同版本的程序A.如上所述,這很髒。 – harper 2011-04-20 12:12:23

+0

是的,真的很髒:-) – krisy 2011-04-20 14:23:38

0

如果您有很多這樣的功能,可能值得將它們導出到其他庫。例如,我正在處理可執行文件中只有200行的100000行代碼。

+0

如果我理解正確,這將意味着修改'程序A'的源代碼,我不允許這麼做:-( – krisy 2011-04-20 12:06:14

0

如果您的程序聲明功能與__declspec(dllexport)的,或者如果你能夠與你的* .DEF文件編譯的程序,列出您在您的DLL乙需要那麼你可能會得到DLL導出導出函數的地址GetProcAddress Win32 API函數(傳遞可執行文件的模塊句柄,您可能通過名稱或其他方式獲得 - 請參閱GetModuleHandle,GetModuleHandleEx

+0

聽起來不錯!在Linux系統下它怎麼樣?從那裏可以到達的功能? – krisy 2011-04-20 14:25:26

+0

嘗試dlopen/dlsym – kert 2011-08-11 21:26:37