[英]Build and override a simple Winelib DLL
我有一個加載庫的 Windows 可執行文件,我想創建一個覆蓋 Windows DLL 的 Winelib DLL。 我已經搜索並嘗試了 2 天,但它不起作用! 請幫我 !
基本上,我創建 mydll.c 和 mydll.spec 來使用以下命令構建 Winelib DLL:
winegcc -m32 -shared -o mydll.dll mydll.c mydll.spec
現在我有mydll.dll.so並且我想覆蓋mydll.dll (兩者都在同一個地方)我該怎么辦? 我嘗試重命名 mydll.dll 但在調用該函數時出現頁面錯誤! 我還嘗試使用 winecfg 配置覆蓋或設置像 WINEDLLPATH 這樣的環境變量。 我不明白如何繼續。
我如何在我的 Windows 可執行文件中加載庫
HINSTANCE DllHandle;
char str[255];
typedef int(__stdcall * tfp)(char * const);
DllHandle = LoadLibrary("mydll.dll");
tfp fp = (tfp)GetProcAddress(DllHandle, "myfunc");
fp(str);
FreeLibrary(DllHandle);
mydll.spec
@ stdcall myfunc(str)
dll文件
#include <windef.h>
int WINAPI myfunc(char * str)
{
strcpy(str, "myfunc from the Winelib DLL");
return 0;
}
使用WINEDEBUG=+module
調試 DLL 加載問題。
我不相信 Wine 會在單個文件夾之外搜索本機.dll.so
文件,但如果您想檢查自己,代碼在dlls/ntdll/loader.c:load_builtin_dll
。
我能夠讓它工作,但必須進行以下更改。
我在 Ubuntu 上使用 wine5,其中似乎默認安裝是 64 位。 我必須首先重命名 wine 的可執行文件,因為它錯誤地使用了 32 位調用,這意味着它不能與 64 位 dll 一起使用。
安裝 wine-tools(用於 winegcc)
apt-get install wine-tools
修復wine64(因為exe似乎加載wine32然后出錯)
cd /usr/lib/wine
mv wine wine32
ln -s wine64 wine
生成文件
all: mydll.dll.so testmydll.exe
mydll.dll.so: mydll.c mydll.spec
winegcc -shared -o mydll.dll mydll.c mydll.spec
testmydll.exe: testmydll.c
winegcc -mno-cygwin -o testmydll testmydll.c
clean:
rm -f *.so
rm -f *.exe
rm -f *~
另外,您的代碼中有錯誤,我已更正。 缺少 __stdcall 和 DLL 的名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.