明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3613|回复: 19

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

  [复制链接]
发表于 2022-8-7 14:20:58 | 显示全部楼层 |阅读模式
本帖最后由 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@这个函数出错,暂时没找到解决方法。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 5明经币 +5 金钱 +30 收起 理由
dtucad + 1 赞一个!
tryhi + 1 很给力!
highflybird + 1 + 30 很给力!
自贡黄明儒 + 1
ssyfeng + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 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也可以实现精确定位和修改自身,这是汇编才有的功能。
发表于 2022-8-8 11:28:52 | 显示全部楼层
baitang36 发表于 2022-8-8 08:52
我这个试验,主要目的是验证用lsp填充内存缓冲区的可行性。
"Comdlg32.dll" 的"GetOpenFileNameA"需要一 ...

Windows系统都自带有C库,你用lisp调用C库的dll,然后用C库的函数操作内存和指针。
发表于 2022-8-8 09:13:53 | 显示全部楼层
(GETFILEDM "*.lsp;*.fas;*.vlx")
; 错误: 出现异常: 0xC0000005 (访问冲突)
; 警告: 忽略展开 异常
; 错误: 出现异常: 0xC0000005 (访问冲突)
; 错误: 出现异常: 0xC0000005 (访问冲突)
; 错误: 出现异常: 0xC0000005 (访问冲突)

点评

用cad2008试验一下  发表于 2022-8-8 09:55
发表于 2022-8-7 14:56:30 | 显示全部楼层
调用api的想法不错,但现在都64位系统和cad了,32位用处会越来越小,期待64位的
 楼主| 发表于 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,会不会也差不多加一个什么东西。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2022-8-8 01:29:15 | 显示全部楼层
因为核显的原因,目前 11、12 代 inter CPU 不支持 CAD2018 以下版本,我安装了32位的 CAD2007 竟然完美运行,所以老哥的研究应用价值很大。
发表于 2022-8-8 07:15:13 来自手机 | 显示全部楼层
核显在win7没有驱动,装个几十块的显卡就行
发表于 2022-8-8 08:54:02 | 显示全部楼层
盛大师出帖,必属精品!
发表于 2022-8-8 09:03:03 | 显示全部楼层
自贡黄明儒 发表于 2022-8-7 16:57
VBA的64位要在前加一个ptrsafe,会不会也差不多加一个什么东西。

给你点赞给你点赞
发表于 2022-8-8 09:06:01 | 显示全部楼层
baitang36 发表于 2022-8-8 08:52
我这个试验,主要目的是验证用lsp填充内存缓冲区的可行性。
"Comdlg32.dll" 的"GetOpenFileNameA"需要一 ...

大神就是牛逼
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-23 16:38 , Processed in 0.189072 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表