JSA里的FFI(8)——删除到回收站
wils
创作者俱乐部成员
EH论坛有朋友问,宏如何删除文件到回收站,而不是直接删除
大佬ykcbf1100给出了VBA解答
过两天就有ffi对象了,现在正好试试JSA里,在没有结构体时,手动构造参数
function wstring(s) {
const buff = new ArrayBuffer(s.length * 2 + 2)
const view = new Uint16Array(buff)
for (let i = 0; i < s.length; i++) {
view[i] = s.charCodeAt(i)
}
return buff
}
function aa()
{
const p = `${ThisWorkbook.Path}\\a.txt`
const shell32 = FFI.LoadLibrary('shell32')
const SHFileOperationW = shell32.LoadFunction('', 'SHFileOperationW', '', 'int32', ['pointer'])
const _SHFILEOPSTRUCTW = FFI.Malloc(32)
_SHFILEOPSTRUCTW.Write('uint32', 0, 0)
_SHFILEOPSTRUCTW.Write('uint32', 4, 0x3)
_SHFILEOPSTRUCTW.Write('pointer', 8, wstring(p))
_SHFILEOPSTRUCTW.Write('uint32', 12, 0)
// 0x40 = FOF_ALLOWUNDO
// 0x10 = FOF_NOCONFIRMATION(关闭确认框)
// 0x04 = FOF_SILENT(隐藏进度条,可选)
_SHFILEOPSTRUCTW.Write('uint16', 16, 0x40 | 0x10 | 0x04)
_SHFILEOPSTRUCTW.Write('uint32', 20, 0)
_SHFILEOPSTRUCTW.Write('uint32', 24, 0)
_SHFILEOPSTRUCTW.Write('uint32', 28, 0)
SHFileOperationW.Call(_SHFILEOPSTRUCTW)
}比VBA好的地方是调用宽字符串的接口时比较方便
但现在还没有结构体,自己构造参数时,宽字符串需要传递指针这一步有点麻烦
希望有大佬指点,如果我需要指向宽字符串的指针,怎么写更方便
现在的办法是创建ArrayBuffer再每次写入2字节,不怎么聪明的样子。。。
创作者俱乐部成员
创作者俱乐部成员