找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 8406|回复: 19

[越飞越高讲堂] (2)CAD的API编程指南(上)--DynamicWrapperX

[复制链接]

已领礼包: 8121个

财富等级: 富甲天下

发表于 2013-5-7 02:52:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 Highflybird 于 2013-5-7 02:56 编辑

越飞越高讲堂(2)
CAD中如何利用API 编程呢?
对于arx来说,这点根本就不是问题,直接用api函数,因为它已经成了C++的内部函数了。对于VBA来说,也不太成问题。利用VBIDE中插入模块,申明API函数,就可以用了。对于VLISP来说,就需要借助其他工具了,譬如调用编译好的dll, 或者调用其他的例如EXCELVBA,或者调用CADVBA,都需要用读写文件的方式或者暂时写入VBIDE的方式,这方面的研究nonsmallaroom等都发表了帖子,研究得很详细了。下面我要用另外一种方式来实现它。

(上部)DynWrapX和VLISP中的API

首先申明:
此文属于首创,如需转载请说明来源和作者!
不用OpenDCL,不用VB和VBA,不用ARX,下面的一些你能做到吗?
你想使得你的对话框(我这里特指DCL)添加菜单吗?你想在你的DCL中添加真彩色图片或者做成各种特效,譬如渐变的背景?你想运用各种API函数为你的程序锦上添花吗?甚至完成以前不敢想象的事情?你想函数对参数传址使用么?你想得到比grread还强大的效果吗?你想创建一个非模态的DCL吗?甚至你想在LISP中嵌入汇编语言吗?等等。
无标题.png
如果你有了DynamicWrapperX这个插件,你什么都可以做了。
DynamicWrapperX 是一个ActiveX部件,它允许调用DLL库里面的函数,特别是API 的函数。可用于 Jscript和VBscript。它由汇编语言写成。短小精悍,才 13Kb,压缩后才5kb,比OpenDCL.arx甚至自己做的.dll文件都小很多,你甚至可以将它打包到vlx文件中。虽然它很小,但是很给力。
它可以极大程度地扩展LISP的编程范围,赋予DCL和VLISP更多功能。它可以适应不同的CAD版本,兼容windows98~windows 7。
首先给出这个插件的英文帮助和下载地址:
http://www.script-coding.com/dynwrapx_eng.html
我这里另贴上:
DynWrapX.dll 文件
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:dynwrapx.rar 
下载次数:121  文件大小:5.79 KB 
下载权限: 不限 以上  [免费赚D豆]

这个是DynamicWrapperX 插件
Win32API.txt  文件
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:Win32API.Txt 
下载次数:139  文件大小:705.65 KB 
下载权限: 不限 以上  [免费赚D豆]

这个不是必需的,是api 函数的查看文件,api viewer用的WIN32API.TXT -- Win32 API Declarations for Visual Basic
如何在系统中注册:
在windows下有两种方法:
1.运行 regsvr32.exe  插件路径\dynwrapx.dll, 注册给所有用户;
2.运行 regsvr32.exe  /i  插件路径\dynwrapx.dll, 注册给当前用户;
如果你把它拷贝到system32目录下,直接运行 regsvr32.exe  dynwrapx.dll就可了。
反注册用 regsvr32.exe /u插件路径\dynwrapx.dllregsvr32.exe /u /i 插件路径\dynwrapx.dll
在windows 7 下,读者应该注意这点:需要以管理员身份注册运行。建议拷贝到其他目录注册运行。
http://support.microsoft.com/kb/827659
内部函数简介:
1.        Register( DllName, FuncName [, i=ParamTypes] [, r=RetValType] )
注册一个DLL中的函数,dllName,dll文件名,funcName,dll里面的函数名,i参数类型,r返回值类型。
2.        RegisterCallback( FuncRef [, i=ParamTypes] [, r=RetValType] )
注册一个回调函数,FuncRef按址引用的函数名,i参数类型,r返回值类型。
3.        NumGet( Address [, Offset] [, Type] )
得到某个指针的内容,Address指针地址,Offset偏移值,Type数值类型。
4.        NumPut( Var, Address [, Offset] [, Type] )
改变某个指针的内容,Var,要赋值的变量,Address指针地址,Offset偏移值,Type数值类型。
5.        StrPtr( Var [, Type] )
得到一个字符串的指针(实际也是创见一个指针的方法),var 字符串,type是类型
6.        StrGet( Address [, Type] )
读取某个指针的值,Address地址,type类型。
7.        Space( Count [, Char] )
创建指定长度和指定字符的字符串。Count,字符串长度,char指定的字符
创建、释放和注册函数:
创建:(setq wrap (vlax-create-object "DynamicWrapperX"))
释放:(vlax-release-object  wrap)
注册函数: (vlax-invoke  wrap  'Register  "user32.dll"  "MessageBoxW"  "i=hwwu" "r=l")
可以看出,这个甚至比VB中API函数的引用更简单。
;; 关于MessgeBox函数参见 http://baike.baidu.com/view/927800.htm
先创建几个下面用得着的对象
[pcode=lisp,true]
  (setq *APP (vlax-get-acad-object))
  (setq *DOC (vla-get-ActiveDocument *APP))
  (setq hCAD (vla-get-hwnd *APP))
  (setq hDOC (vla-get-hwnd *DOC))
  (setq wrap (vlax-create-object "DynamicWrapperX"))
[/pcode]
几个简单的例子:
[pcode=lisp,true]
  ;; 例如一个简单的消息框
  (vlax-invoke wrap 'Register "user32.dll" "MessageBoxW" "i=hwwu" "r=l")
  ;; 'Register 注册;
  ;; "User32.dll",可以省略为"USER32",也可以是自己的dll,例如"MyLib.dll";
  ;; "MessageBoxW" ,API函数名字,功能是弹出一个消息框;
  ;; "i=hwwu",是参数列表,见函数原型:
  ;; int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT UType);
  ;; h,父窗口句柄,w,宽字符,消息内容,w宽字符,标题文字,u,无符号整数,指的是消息框的类型
  ;; "r=l"代表返回数值是整数。
  (vlax-invoke wrap 'MessageBoxW hCAD "Hello,DynWrap" "Test for API" 2)
  ;; 返回值代表如下:
  ;; IDOK 1                    按下"OK"
  ;; IDCANCEL 2                按下"取消"
  ;; IDABORT 3          按下"放弃"
  ;; IDRETRY 4           按下"重试"
  ;; IDIGNORE 5           按下"忽略"
  ;; IDYES 6                按下"是"
  ;; IDNO 7           按下"否"
  ;; IDCLOSE 8          按下"关闭"
  ;; IDHELP 9                按下"帮助"
  ;; 获得当前进程的命令行
  (vlax-invoke wrap 'Register "kernel32" "GetCommandLine" "r=s")
  ;; 这个函数没有参数,故而没有"i="
  (vlax-invoke wrap 'GetCommandLine)
  ;; 譬如返回:"C:\\Program Files\\AutoCAD 2006\\acad.exe\" 这样,我们就知道程序的所在目录和名称。
  ;; 发出蜂鸣声
  (vlax-invoke wrap 'Register "kernel32" "Beep" "i=uu")             ;蜂鸣声有返回值但可以不需要.
  (vlax-invoke wrap 'Beep 800 1000)                              ;通过喇叭发出声音.
[/pcode]
参数符号代表的类型:
l -  32位整数 - LONG, INT, LPARAM, LRESULT, etc, 范围: -2147483648 ... 2147483647;
u - 无符号32位整数 - ULONG, UINT, DWORD, WPARAM, ... , 范围: 0 ... 4294967295;
注意,在lisp中,无符号的整数如果超出2147483647 会溢出,例如(+ 2147483647 1)
返回-2147483648
h - 句柄 - HANDLE, HWND, HMODULE, HINSTANCE, HICON, ... , 范围: -2147483648 ... 4294967295;
p - 指针; 就是一个数值,对象或者字符串的地址。
n - 16位整数- 短整数, 范围: -32768 ... 32767;
t - 无符号16位整数- USHORT, WORD, WCHAR, OLECHAR, ... , 范围: 0 ... 65535;
c - 8位整数- CHAR, 范围: -128 ... 127;
b - 无符号8位整数- UCHAR, BYTE, ... , 范围: 0 ... 255;
f – 浮点数 - FLOAT;
d – 双精度数 - DOUBLE;
w - Unicode 字符串 - BSTR, LPWSTR, LPOLESTR, OLECHAR *, WCHAR *, ...;
s - ANSI/Windows 字符 (默认代码页) - LPSTR, LPCSTR, CHAR *, ...;
z - OEM/DOS字符(默认代码页) - LPSTR, LPCSTR, CHAR *, ...
返回值也是如此。但是我们在lisp中用到最多的是l数值型,可以代表指针,也可以代表长整数,短整数,甚至布尔值等等。
关于字符串的宽字符和ASCII字符,请读者自行参考相关资料。
RegisterCallBack方法:
鉴于LISP对于函数的地址取得的方式和对参数的保护模式,所以这个函数对LISP意义不大,略去。
其他方法:
NumGet( Address [, Offset] [, Type] )
从一个地址中获取数值。Address,基址,Offset偏移量,能用于循环读写一系列的数值。Type,数值类型,默认”l”,即长整数,只能小写字母。返回值就是这个地址中的内容。
NumPut( Var, Address [, Offset] [, Type] )
写入数值到内存中。Var,要写入的变量,剩下的几个参数跟NumGet相同。返回值是写入的字节数。
上面两个函数,允许你在基址占用的内存中存取数据(结构,数组等)。
StrPtr( Var [, Type] )
创建一个字符串指针,然后你可以在这个字符串占用的内存中存取数据(结构,数组等)。Var,是字符串变量或者常量,type是字符串类型,可以是”w”(默认方式),”s”,”z”。返回一个指针(即一个长整数)。
StrGet( Address [, Type] )
从指定地址中,读取字符串,并返回其拷贝。Address可以是数值变量的地址,也可以是字符串的首址,type 同StrPtr。
Space( Count [, Char] )
创建指定长度指定字符的字符串。Count,数量,Char,指定字符,如果没这个参数,指定字符就是空格。
下面是其用法例子:
[pcode=lisp,true]
  ;; 取得某个地址的内容,例如读取字符串的ASCII代码
  ;; 其实就是(vl-string->list "Hello, world! It's me.")
  ;l 举这个例子仅仅是说明其用法。
  (setq str "Hello, world! It's me.")
  (setq sLen (strlen str))
  (setq codes "")
  (setq i 0)
  (repeat sLen
    (setq code (vlax-invoke wrap 'NumGet Str (* i 2) "t"))        ;乘以2是因为偏移必须是两个字节"t"
    (setq codes (strcat codes (itoa code) " "))
    (setq i (1+ i))
  )
  (alert codes)                                
                                          
   
  ;; 读取并写入内存,例如反转字符串.
  ;; 这个例子就是反转字符串。
  ;; 对中文字符串要复杂些
  (setq buf (vlax-invoke wrap 'Space sLen))                        
  (setq pBuf (vlax-invoke wrap 'StrPtr Buf "s"))                ;获得缓冲区地址,用来读写
  (setq i 0)
  (setq j (1- sLen))                                                ;最后一个下标要字符串长度减1
  (repeat sLen
    (setq code (vlax-invoke wrap 'NumGet Str (* i 2) "t"))        ;从左到右读
    (vlax-invoke wrap 'NumPut code pBuf (* j 2) "t")            ;从右到左写入缓冲区
    (setq j (1- j))                                                ;偏移地址增加
    (setq i (1+ i))                                                ;偏移地址减少
  )        
  (alert (vlax-invoke wrap 'StrGet pBuf))                        ;最后读取缓冲区内容
[/pcode]
运用上面方法也可以用来通过改变地址内容改变变量值,即对函数参数的传址使用。
更精彩的在后面:
具体运用和实例剖析:
请见下面的完整的例子:其中已经有注释,包含了详细的解释。

在此特别感谢nonsmall,在编写这个程序过程中得到了他的很多帮助及其建议。
另外一些关于用LISP调用API的链接:

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=72145&highlight=API
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=74063&highlight=API
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=60155&highlight=API
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=60884&highlight=API
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=84651&highlight=API

提醒:因为用到了API,可能会对内存有读写,所以编程前应保存工程。注意对内存的释放和存取可操作性。
多谢Caiqs的建议,"如果你有了DynamicWrapperX这个插件,你什么都可以做了。"这句话我夸大其词了,具体有哪些不能做的,请参考70楼。

DynWrapDialog.LSP

14.84 KB, 下载次数: 61, 下载积分: D豆 -1 , 活跃度 1

评分

参与人数 1D豆 +5 贡献 +1 收起 理由
炫翔 + 5 + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

本帖被以下淘专辑推荐:

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 188个

财富等级: 日进斗金

发表于 2013-5-7 05:47:58 来自手机 | 显示全部楼层
敬佩敬佩。向前辈学习。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-18 07:58:48 | 显示全部楼层
多时未上来,偶尔一看发现提起了我,时间太久,我以前建议什么了?佩服楼主的研究精神,我等作项目只顾自已,象楼主这样无私的放出源代码实属可贵
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-19 15:58:21 | 显示全部楼层
学习学习嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-5-19 16:21:59 | 显示全部楼层
caiqs 发表于 2013-5-18 07:58
多时未上来,偶尔一看发现提起了我,时间太久,我以前建议什么了?佩服楼主的研究精神,我等作项目只顾自已 ...

哪个地方提到了阁下?

点评

倒数第二行。看书不认真哦! “多谢Caiqs的建议。。。  发表于 2013-5-19 16:29
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-25 16:47:35 | 显示全部楼层
Lispboy 发表于 2013-5-19 16:21
哪个地方提到了阁下?

多谢Caiqs的建议,"如果你有了DynamicWrapperX这个插件....


这里啊,我就是Caiqs
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 93个

财富等级: 招财进宝

发表于 2013-9-25 10:43:03 | 显示全部楼层
好东西!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 305个

财富等级: 日进斗金

发表于 2014-3-23 21:56:46 | 显示全部楼层
敬佩敬佩。向前辈学习。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2014-12-23 13:56:41 | 显示全部楼层
能不能让lisp程序自动注册呢?即自动运行下面一句?{:soso_e132:}
运行 regsvr32.exe  插件路径\dynwrapx.dll, 注册给所有用户;

点评

高版在明经上有一个帖子给了这个代码了。原帖地址:http://bbs.mjtd.com/forum.php?mod=viewthread&tid=75845&extra=page%3D1%26filter%3Dtypeid%26typeid%3D108%26typeid%3D108  详情 回复 发表于 2014-12-26 14:19
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 187个

财富等级: 日进斗金

发表于 2014-12-26 10:35:11 | 显示全部楼层
本帖最后由 GFspringwillow 于 2014-12-26 10:38 编辑

看不懂啊,对API一点都不了解,看的一头雾水!这样只是可以用API函数了,高版能不能再来一篇介绍API函数的基础帖子?供我等对API还未入门的人学习啊!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 187个

财富等级: 日进斗金

发表于 2014-12-26 14:19:55 | 显示全部楼层
本帖最后由 GFspringwillow 于 2014-12-26 14:29 编辑
/db_自贡黄明儒_ 发表于 2014-12-23 13:56
能不能让lisp程序自动注册呢?即自动运行下面一句?
运行 regsvr32.exe  插件路径\dynwrapx. ...

高版在明经上有一个帖子给了这个代码了。原帖地址:http://bbs.mjtd.com/forum.php?mod=viewthread&tid=75845&extra=page%3D1%26filter%3Dtypeid%26typeid%3D108%26typeid%3D108
  1. ;;; 本程序演示了如何通过Activex来调用arx中的类(class)和函数。
  2. ;;; 程序先注册ActiveX,后创建一个object,用vlax-invoke-method
  3. ;;; 来调用其中的函数的功能,也可以通过它得到返回值。
  4. ;;; 程序未加出错判断,请自行加入。
  5. ;;; highflybird      2009-5-23 Haikou
  6. (vl-load-com)
  7. (defun c:test (/ obj)
  8.   (DllRegister "F:\\dynwrapx.DLL")   ; 也可以增加判断,如果注册了则无需再注册
  9.   ( 程序正文 )
  10.   (vlax-release-object obj)      ; 别忘记释放实例
  11.   (UnDllRegister "F:\\dynwrapx.DLL") ; 反注册
  12.   (princ)
  13. )
  14. ;;; DLL 的注册
  15. (defun DLLRegister (dll)
  16.   (startapp "regsvr32.exe" (strcat "/s "" dll """))
  17. )
  18. ;;; DLL 的反注册
  19. (defun UnDLLRegister (dll)
  20.   (startapp "regsvr32.exe" (strcat "/u /s "" dll """))
  21. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2015-4-3 10:19:46 | 显示全部楼层
如果dynwrapx.dll补打包进vlx文件中,怎么注册呢?(DLLRegister dll)不是要求绝对路径吗?

点评

可以创建一个临时文件。  详情 回复 发表于 2015-4-3 12:03
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2015-4-3 12:03:04 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2015-4-3 10:19
如果dynwrapx.dll补打包进vlx文件中,怎么注册呢?(DLLRegister dll)不是要求绝对路径吗?

可以创建一个临时文件。

点评

请教大师两个问题: ;;; for test (defun C:Read_Write_BinaryFile (/ name buff file) (if (setq name (getfiled "Select a file" "C:/" "" 8));选择DynWrapX.dll? (progn (setq buff (readbinary  详情 回复 发表于 2015-4-8 09:52
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2015-4-8 09:52:59 | 显示全部楼层
本帖最后由 /db_自贡黄明儒_ 于 2015-4-8 10:54 编辑
Highflybird 发表于 2015-4-3 12:03
可以创建一个临时文件。

谢谢,成功将dynwrapx.dll打包进vlx.什么时候出《CAD的API编程指南()--DynamicWrapperX》呀?期待................
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2016-12-1 22:16:45 | 显示全部楼层
对于消息框(vlax-invoke  wrap  'Register  "user32.dll"  "MessageBoxW"  "i=hwwu" "r=l"),唯一不好理解的是"i=hwwu"为什么这么写了?大师指示原型int WINAPI MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType),是不是应该写成"i=hllu"?叫我怎么悟得透?痛苦!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 23:53 , Processed in 0.354843 second(s), 76 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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