我编写了一个go在widow下不用cgo,只用系统调用7z.dll,操作7z文件的代码。下面是项目地址
https://github.com/jan-bar/interesting/blob/master/zip7/main.go
当前的
[win_no_cgo.go#L216](https://github.com/jan-bar/interesting/blob/9c300c135a2822326ba911e00b5e2a2528310156/zip7/z7/win_no_cgo.go#L216)行是直接返回,可以成功读取7z文件。如下所示成功读取7z,打印文件名和CRC和修改时间等等
![image.png](https://static.golangjob.cn/221216/99d97c86824817508acfe9640273cfc3.png)
一旦取消216行注释,那么7z.dll就会调用`CryptoGetTextPassword`方法,根据方法签名需要设置`BSTR *password`
[win_no_cgo.go#L227](https://github.com/jan-bar/interesting/blob/9c300c135a2822326ba911e00b5e2a2528310156/zip7/z7/win_no_cgo.go#L227)
![image.png](https://static.golangjob.cn/221216/89b0b110537770b4945c3c5c65409a61.png)
通过阅读7z源码,这个字符串确实是通过`SysAllocString`申请的,但是我无论怎么试,怎么为pass赋值,执行都会报错。
有没有大佬帮忙解决一下这个问题。不然我这代码就只能读取不加密的7z压缩文件了。没有办法,那我就不深入研究了,直接exec调用`7za`可执行程序吧。系统调用太磨人了。本来还想写解压逻辑和压缩逻辑,要是不能把加密添加进去,感觉没啥意思了。
有疑问加站长微信联系(非本文作者)