gpt4 book ai didi

wine - 在 Linux 上使用 Wine 包装 Windows dll

转载 作者:行者123 更新时间:2023-12-03 19:26:27 25 4
gpt4 key购买 nike

基本上我想知道是否有办法使用Wine(可能是libwine?)为windows .dll制作包装器.so。我加载 .dll,从中加载一些函数指针,并像 FFI 一样使用 Wine。似乎 Wine 必须在内部执行此操作,不断地从 System V ABI 和 Windows ABI 来回调用。

具体来说,我有一个用于昂贵的科学数据记录设备的接口(interface)库,该设备通过 UDP 进行通信,而不是直接与硬件通信。 API 本身只有大约 20 个使用简单类型(ints、doubles、double[])的函数,因此如果确实可能的话,手工制作包装器 .so 不会有那么多工作。

编辑:
我取得了一些部分进展,但不是解决方案。我做了一些阅读,发现了有关 winegcc 的信息。我知道 libSDL 有一个相当直接的日志功能,所以我得到了它的 windows .dll 并做了以下事情:

HINSTANCE sdl = LoadLibrary("SDL2.dll");
assert(sdl);

typedef void logf(const char* fmt, ...);
logf *log = (logf*)GetProcAddress(sdl, "SDL_Log");
assert(log);

log("Hello");

它有点工作!它在控制台上打印出“INFO: ??{”,因此函数指针被正确检索,并且由于它打印了任何内容,因此 dll 必须正确回调到 libwine。我有点希望 GetProcAddress() 会返回一个魔术蹦床,为我转换 ABI,但也许不是这样?如果我使用内联汇编调用 log 函数来使用 MS ABI 传递参数,它仍然会做同样的事情,所以我不确定接下来要尝试什么。

最佳答案

啊!我是如此接近。发布解决方案,因为它需要几天的挖掘才能弄清楚。

我只需要将“WINAPI”限定符添加到函数声明中。如果它所做的只是设置调用约定,我不确定为什么我的程序集版本不起作用,但无论如何。例如,以下代码使用 windows SDL2.dll 在 Linux 上成功打开一个窗口。

HINSTANCE sdl = LoadLibrary("SDL2.dll");
assert(sdl);

WINAPI __typeof(SDL_Init)* init = GetProcAddress(sdl, "SDL_Init");
err = init(SDL_INIT_VIDEO);
assert(err == 0);

WINAPI __typeof(SDL_CreateWindow)* create_window = GetProcAddress(sdl, "SDL_CreateWindow");
SDL_Window* window = create_window("Drift", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1024, 768, 0);
assert(window);

WINAPI __typeof(SDL_Delay)* delay = GetProcAddress(sdl, "SDL_Delay");
delay(3000);

关于wine - 在 Linux 上使用 Wine 包装 Windows dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57120218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com