我有一个加载库的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但是在调用该函数时出现了Page Fault!我还尝试使用winecfg配置覆盖或设置环境变量,如WINEDLLPATH。我不明白该怎么做。
我如何在Windows可执行文件中加载库
HINSTANCE DllHandle;
char str[255];
typedef int(*tfp)(char * const);
DllHandle = LoadLibrary("mylib.dll");
tfp fp = (tfp)GetProcAddress(DllHandle, "myfunc");
fp(str);
FreeLibrary(DllHandle);
mydll.spec
@ stdcall myfunc(str)
mydll.c
#include <windef.h>
int WINAPI myfunc(char * str)
{
strcpy(str, "myfunc from the Winelib DLL");
return 0;
}
答案 0 :(得分:0)
使用WINEDEBUG = +模块调试DLL加载问题。
我不相信葡萄酒搜索单个文件夹之外的原生.dll.so文件,但可能是错误的。代码在dlls / ntdll / loader.c中,如果你想检查自己(grep for load_builtin_dll)。
答案 1 :(得分:0)
我能够让它工作,但必须进行以下更改。
我在 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 的名称。