gpt4 book ai didi

c++ - 在 MinGW 上使用 libffi 调用 Windows API

转载 作者:行者123 更新时间:2023-11-30 04:33:24 25 4
gpt4 key购买 nike

我正尝试让 FFI 支持我的新编程语言,它是使用 MinGW 工具链和 QT Creator 用 C++ 编写的。

为此,我使用了一个定制版本的 libffi,可在此处找到:http://ftp.gnome.org/pub/GNOME/binaries/win32/dependencies/libffi-dev_3.0.6-1_win32.zip

我还尝试了另一个版本:http://pkgs.org/fedora-14/fedora-updates-i386/mingw32-libffi-3.0.9-1.fc14.noarch.rpm.html通过在 Linux 上下载 SRPM 文件、解压缩并将所需文件复制到 Windows 分区。

无论如何,我包含了所需的头文件,将导入库添加到项目中并将 .dll 放在应用程序的 .exe 旁边,它编译并运行,成功调用 MessageBeep()。接下来我用 MessageBoxA() 尝试了它,但它一直在崩溃。调试器似乎没有提供太多有用的信息(编辑:除了调用 MessageBoxA did 之外)所以我一直在摆弄东西并重新运行无济于事。

为了将问题与我的语言细节隔离开来,我尝试通过自己填充所有参数来手动调用 MessageBoxA,导致下面的代码仍然崩溃。

所以我的问题提炼为:如何让下面的代码片段在 QT Creator/MinGW 下运行并实际显示消息框?

#include "libffi/include/ffi.h"
#include <QLibrary>

void testMessageBox()
{
int n = 4;
ffi_cif cif;
ffi_type **ffi_argTypes = new ffi_type*[n];
void **values = new void*[n];

values[0] = new ulong(0);
values[1] = (void *) "hello";
values[2] = (void *) "mommy";
values[3] = new int32_t(0);

ffi_argTypes[0] = &ffi_type_ulong;
ffi_argTypes[1] = &ffi_type_pointer;
ffi_argTypes[2] = &ffi_type_pointer;
ffi_argTypes[3] = &ffi_type_uint32;

ffi_type *c_retType = &ffi_type_sint32;
int32_t rc; // return value

if (ffi_prep_cif(&cif, FFI_STDCALL, n, c_retType, ffi_argTypes) == FFI_OK)
{
QLibrary lib("user32.dll");
lib.load();
void *msgbox = lib.resolve("MessageBoxA");
ffi_call(&cif, (void (*)()) msgbox, &rc, values);
}
}

最佳答案

您应该将地址而不是值传递给值数组。 mingw64下的工作代码是

   #include <stdio.h>
#include <ffi.h>
#include <Windows.h>
int main()
{

ffi_cif cif;
HINSTANCE dllHandle = LoadLibrary("user32.dll");

int n = 4;

ffi_type *ffi_argTypes[4];
void *values[4];
UINT64 a=0;
UINT32 b=0;
TCHAR* s1= "hello";
TCHAR* s2= "hello2";
values[0] = &a;
values[1] = &s1;
values[2] = &s2;
values[3] = &b;
ffi_argTypes[0] = &ffi_type_uint64;
ffi_argTypes[1] = &ffi_type_pointer;
ffi_argTypes[2] = &ffi_type_pointer;
ffi_argTypes[3] = &ffi_type_uint;
ffi_type *c_retType = &ffi_type_sint;
ffi_type rc; // return value
if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &ffi_type_sint, ffi_argTypes) == FFI_OK) {


ffi_call(&cif, FFI_FN(GetProcAddress(dllHandle,"MessageBoxA")), &rc, values);
}


return 0;
}

关于c++ - 在 MinGW 上使用 libffi 调用 Windows API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6886995/

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