簡體   English   中英

構建和覆蓋一個簡單的 Winelib DLL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM