baitang36 发表于 2022-8-7 14:20:58

[试验]用纯lisp打造一个多选文件对话框(仅实现32位,64位cad不能用)

本帖最后由 baitang36 于 2022-8-7 14:52 编辑

用法:
先加载getfiledm32.fas
命令: (GETFILEDM "*.lsp")
选单个文件时返回带路径文件名
选多个文件时返回如下格式字符串
"C:\\00\\ beep.lsp delif.lsp fun444.lsp fun7.lsp getfiledm.lsp"
C:\\00\\是路径
后面的都是选择的文件名,用空格间隔。
也可以选多种文件,如:
命令: (GETFILEDM "*.lsp;*.fas;*.vlx")
不同扩展名之间用分号隔开。
实现原理很简单,就是用保留函数直接调用Windows的api
这里用到的是"Comdlg32.dll" 的"GetOpenFileNameA"
填入它需要的参数,调用它就行了。
在64位acad下_ptr@这个函数出错,暂时没找到解决方法。

baitang36 发表于 2022-8-8 08:52:02

yxp 发表于 2022-8-8 01:29
因为核显的原因,目前 11、12 代 inter CPU 不支持 CAD2018 以下版本,我安装了32位的 CAD2007 竟然完美运 ...

我这个试验,主要目的是验证用lsp填充内存缓冲区的可行性。
"Comdlg32.dll" 的"GetOpenFileNameA"需要一个OpenFileName结构,这个结构挺复杂,但很多位置都可以用NULL填充,必须填的地方有四个:过滤字符串地址,输出缓冲区地址,缓冲区长度,还有支持多文件的flag。
我直接用make-string做了一个76字节的字符串作为OpenFileName结构,通过_ptr@来修改字符串内容。
这个试验成功了,说明用lsp可以操作内存中的任何可写部分,在程序运行过程中改变自身也是可能的。lsp也可以实现精确定位和修改自身,这是汇编才有的功能。

yxp 发表于 2022-8-8 11:28:52

baitang36 发表于 2022-8-8 08:52
我这个试验,主要目的是验证用lsp填充内存缓冲区的可行性。
"Comdlg32.dll" 的"GetOpenFileNameA"需要一 ...

Windows系统都自带有C库,你用lisp调用C库的dll,然后用C库的函数操作内存和指针。

晨曦CAD 发表于 2022-8-8 09:13:53

(GETFILEDM "*.lsp;*.fas;*.vlx")
; 错误: 出现异常: 0xC0000005 (访问冲突)
; 警告: 忽略展开 异常
; 错误: 出现异常: 0xC0000005 (访问冲突)
; 错误: 出现异常: 0xC0000005 (访问冲突)
; 错误: 出现异常: 0xC0000005 (访问冲突)

ssyfeng 发表于 2022-8-7 14:56:30

调用api的想法不错,但现在都64位系统和cad了,32位用处会越来越小,期待64位的

baitang36 发表于 2022-8-7 14:58:36

ssyfeng 发表于 2022-8-7 14:56
调用api的想法不错,但现在都64位系统和cad了,32位用处会越来越小,期待64位的

正在研究中,思路是自己写个dll加载。相当于给cad打个补丁

自贡黄明儒 发表于 2022-8-7 16:57:48

VBA的64位要在前加一个ptrsafe,会不会也差不多加一个什么东西。

yxp 发表于 2022-8-8 01:29:15

因为核显的原因,目前 11、12 代 inter CPU 不支持 CAD2018 以下版本,我安装了32位的 CAD2007 竟然完美运行,所以老哥的研究应用价值很大。

xinxirong 发表于 2022-8-8 07:15:13

核显在win7没有驱动,装个几十块的显卡就行

Dani1988 发表于 2022-8-8 08:54:02

盛大师出帖,必属精品!

tomonkey239 发表于 2022-8-8 09:03:03

自贡黄明儒 发表于 2022-8-7 16:57
VBA的64位要在前加一个ptrsafe,会不会也差不多加一个什么东西。

给你点赞给你点赞

tomonkey239 发表于 2022-8-8 09:06:01

baitang36 发表于 2022-8-8 08:52
我这个试验,主要目的是验证用lsp填充内存缓冲区的可行性。
"Comdlg32.dll" 的"GetOpenFileNameA"需要一 ...

大神就是牛逼
页: [1] 2
查看完整版本: [试验]用纯lisp打造一个多选文件对话框(仅实现32位,64位cad不能用)