尝试使用FFidl在TCL中使用crypt32.dll,但未成功

尝试使用FFidl在TCL中使用crypt32.dll,但未成功,tcl,Tcl,我使用了一些代码表单,但我认为它可能与传递数据有关,而FFidl数据类型不支持它 package require Ffidl set handle [ffidl::symbol [file join C:/ Windows System32 crypt32.dll] CryptProtectData] ffidl::callout CryptProtectData_callout {pointer-utf8 pointer-utf8 pointer-utf8 pointer-utf8 p

我使用了一些代码表单,但我认为它可能与传递数据有关,而FFidl数据类型不支持它

package require Ffidl
set handle [ffidl::symbol [file join C:/ Windows System32 crypt32.dll] CryptProtectData]
ffidl::callout CryptProtectData_callout {pointer-utf8 pointer-utf8 pointer-utf8 pointer-utf8     pointer-utf8 int pointer-utf8} int $handle stdcall

proc CryptProtectData {data} {
    set value ""
    if [CryptProtectData_callout $data NULL NULL 0 NULL 0 $value] {
        puts $value
    } else {
        puts "crypt returned 0: $value"
        return {}
    }
}
CryptProtectData "hello how are you"

它是如何失败的?错误消息说什么?你必须定义这种类型。我一直在使用API监视器查看错误,当我将调用更改为{pointer obj int pointer obj}时,API不会抛出任何错误,但它只解密任何加密的前两个字符。看起来cbData在加密时只传递两个字节,因此在检索时只返回两个字节。我将尝试通过定义Johannes所述的类型来解决这个问题。无法为数据块定义: