构建并覆盖一个简单的Winelib DLL

时间:2013-04-05 07:53:45

标签: windows dll wine getprocaddress winelib

我有一个加载库的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;
}

2 个答案:

答案 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 的名称。