Ruby win32 api接口

6 c++ ruby winapi

我需要在ruby中访问win32库的一些函数.我在网上找到了关于Win32API类的非常稀少的信息,所以我在这里问.

我知道你可以这样做:

function = Win32API.new('user32','MessageBox',['L', 'P', 'P', 'L'],'I')
Run Code Online (Sandbox Code Playgroud)

但我似乎无法使用当前的win32绑定调用此函数:

http://msdn.microsoft.com/en-us/library/bb762108%28VS.85%29.aspx

问题在于它的原型:

UINT_PTR SHAppBarMessage(      
    DWORD dwMessage,
    PAPPBARDATA pData
);
Run Code Online (Sandbox Code Playgroud)

我将能够使用win32 ruby​​绑定来获取返回类型和第一个参数,但是,第二个参数需要一个结构.结构的定义如下:

typedef struct _AppBarData {
    DWORD cbSize;
    HWND hWnd;
    UINT uCallbackMessage;
    UINT uEdge;
    RECT rc;
    LPARAM lParam;
} APPBARDATA, *PAPPBARDATA;
Run Code Online (Sandbox Code Playgroud)

我尝试使用两者来定义这个api方法:

api = Win32API.new('shell32','SHAppBarMessage',['L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'],'I') 
Run Code Online (Sandbox Code Playgroud)

api = Win32API.new('shell32','SHAppBarMessage',['L', 'LLLLLLLL'],'I')
Run Code Online (Sandbox Code Playgroud)

但是第一个在"调用"方法期间发生了段错误,而第二个由于"调用"方法调用中指定的参数数量错误而无法运行.有没有办法公开这个api函数而不需要在C++中创建外部模块?

谢谢.

rob*_*.14 0

SHAppBarMessage 有两个参数:一个 DWORD 和一个指向 APPBARDATA 的指针,
因此应该这样声明:

app_bar_msg = Win32API.new('shell32', 'SHAppBarMessage', ['L', 'P'], 'L')

然后打电话:

消息 ID = 1
app_bar_data =“正确初始化的二进制字符串”#应该有sizeof(APPBARDATA)字节
app_bar_msg.call(msg_id,app_bar_data)

但我不了解Ruby,所以也许我错了......