【问题标题】:Build and override a simple Winelib DLL构建和覆盖一个简单的 Winelib DLL
【发布时间】:2013-03-27 13:22:54
【问题描述】:

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

mydll.c

#include <windef.h>

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

【问题讨论】:

  • 我纠正了两个错误,mylib 应该是 mydll 并且您缺少一个 __stdcall,没有它会导致核心转储。

标签: windows dll wine getprocaddress winelib


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我能够让它工作,但必须进行以下更改。

    我在 Ubuntu 上使用 wine5,默认安装似乎是 64 位。我必须先重命名 wine 的可执行文件,因为它错误地使用了 32 位调用,这意味着它不能与 64 位 dll 一起使用。

    安装 wine-tools (for 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 的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多