如何从Ruby调用Win32API函数?

时间:2013-09-17 15:26:05

标签: ruby windows winapi

我想锁定一个文件,因为MS Office应用程序从Ruby程序中执行,因此不允许删除,因为“文件在另一个程序上打开”。

Ruby标准库似乎无法做到这一点 - 我刚试过flock() - 所以我试图调用LockFileEx函数。

fd = File.open("locked.file", File::RDWR|File::CREAT, 0644)
fd.write "this file to be locked"
import_array = %w(p i i i i i)
wapi = Win32API.new('kernel32', 'LockFileEx', import_array, "i")
wapi.call(fd, 1, 0, 0, 0, 0)

wapi.call失败,出现TypeError异常“无法将文件转换为字符串”。

我应该将import_array中的第一项用作什么来表示文件句柄?

如何将文件描述符打包成String?我从哪里获得文件描述符结构?

我正在使用Ruby 1.9.3。

2 个答案:

答案 0 :(得分:2)

首先,您必须将Ruby文件描述符映射到C运行时文件描述符。我不熟悉Ruby源,知道如何做到这一点; 可能是身份转换。

其次,您必须将C运行时描述符映射到Win32文件句柄。为此,您需要_get_osfhandle

第三,您需要修复对LockFileEx的调用,以便实际传递有效的OVERLAPPED结构; NULL不起作用。

答案 1 :(得分:2)

Ruby文件锁定机制是合作的,并且依赖于所有知道Ruby锁定文件约定的方。 Microsoft Office不会合作。

相反,我建议您使用文件系统来强制执行锁定。只需使用标准的Ruby文件处理机制,使用独占锁打开文件。