JSA里的FFI(8)——删除到回收站

wils
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字节,不怎么聪明的样子。。。

海南省
浏览 156
1
2
分享
2 +1
3
1 +1
全部评论 3
 
平凡
支持探索ffi用法,为你点赞
· 湖北省
回复
 
wils
wils

创作者俱乐部成员

发现了错误,wstring里arraybuffer的长度还需要再加2,因为参数路径需要的宽字符串必须以两个\0结束,如果有多个路径要以一个\0分割,所以这里不能简写,用arraybuffer也许是对的
· 海南省
回复
wils
wils

创作者俱乐部成员

另外又写复杂了 const p = `${ThisWorkbook.Path}\\a.txt\0`后面直接加个\0 _SHFILEOPSTRUCTW.Write('pointer', 8, wstring(p))这里不需要wstring _SHFILEOPSTRUCTW.Write('u16string', 8, p)即可
· 海南省
回复