3

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

#include <windef.h>

int WINAPI myfunc(char * str)
{
  strcpy(str, "myfunc from the Winelib DLL");
  return 0;
}
4

2 回答 2

0

用于WINEDEBUG=+module调试 DLL 加载问题。

我不相信 Wine.dll.so会在单个文件夹之外搜索本机文件,但dlls/ntdll/loader.c:load_builtin_dll如果您想检查自己,代码就在其中。

于 2013-04-12T03:55:47.097 回答
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 的名称。

于 2021-06-30T14:43:26.760 回答