莫名 发表于 2003-12-24 22:25:00

设计VB程序时用引用,但程序运行时能否用代码引用呢?
怎样用代码引用?

Taoyimaier 发表于 2003-12-24 22:43:00

莫名这位,应该是GG吧,你说得太不清楚了,结果是别人听不太懂你的意思,可能是自己水平有限吧,http://www.mjtd.com/a2/list.asp?id=488这个是以前我在明经看到的相关的文章,用VLisp调用VB写得DLL,大家可以看看先,让后也许就会懂一些不好怎么用文字表达的东西了,

efan2000 发表于 2003-12-24 22:48:00

使用VL调用VB编写的AcitveX DLL。
首先在VB中新建一个ActiveX DLL工程,工程名称为VBTest,新建一个类模块,名称为Test。
在类模块中加下下面的代码,其中GetComputerName的API函数是用于获取本地的计算机名称。具体说明参考API资料。

Private Declare Function APIGetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Public Property Get GetComputerName() As String
    Dim strString As String
    strString = String(255, Chr$(0))
    APIGetComputerName strString, 255
    strString = Left$(strString, InStr(1, strString, Chr$(0)))
    GetComputerName = strString
End Property

完成后,编译成VBTest.DLL文件。
接下来,在VL中,首先获取该对象的引用。
(setq vltest (vlax-create-object "VBTest.test"))
接着,获取它的GetComputerName属性。
(setq name (vlax-get-property vltest 'getcomputername))
这时就会在IDE窗口中出现自己的计算机名称了。其它的使用类似,有兴趣的朋友可以自己去研究。
以下附上所有的代码。



这是以前在晓东CAD空间应一个朋友的要求而做的,感兴趣的可以参考。
http://www.xdcad.net/forum/showthread.php?s=&postid=231959#post231959

mikewolf2k 发表于 2003-12-25 18:49:00

Taoyimaier老弟,那我就不客气了.
明经通道上那篇关于dll的文件早就看过了,我的dll就是参考它做的,在vba中调用成功.在lisp中调用就看不懂了,没有成功.因此求详细的lisp源程序.
什么时候能搞出来都行,反正我现在还在编程过程中,短时间内还用不上.

Taoyimaier 发表于 2003-12-26 00:35:00

那天有时间帮你作一个简单的吧,可能你得VLisp用的还不太熟练,呵呵

mikewolf2k 发表于 2003-12-26 19:05:00

不瞒您说,lisp我一窍不通.

Taoyimaier 发表于 2003-12-27 09:02:00

程序我写出来了,VB的DLL代码如下
'该DLL虽然简单,但是其功能却是一般的VLisp所不容易实现的
'主要是VLisp不容易实现对话框功能(现在好像有一些第三方的软件,比如ObjectDCL可以实现一些),
'所以有时候我认为,学习DCL没有什么必要,好处就是使得你的Lisp程序更加一体化,但是我想DCL实现
'对话框功能也是几乎不可能的把                   Designed by Taoyimaier

Function dia_show_test() As String
Dim return_str As String
dia_frm.dia1.ShowOpen
On Error GoTo errhand
return_str = dia_frm.dia1.FileName
dia_show_test = return_str
Exit Function
'下面的语句是使得选择了取消按钮后,不出现错误提示
errhand:
If Err.Number = 32755 Then
    Err.Clear
    End If
    Exit Function
End Function

Function get_average(ByVal one As Single, ByVal two As Single, ByVal three As Single) As Single
get_average = (one + two + three) / 3
End Function

'然后将编译后的DLL用命令"regsvr32 dia_pro.dll"注册
'以便于在VLisp里用(vlax-create-object "dia_pro.dia_test")语句调用

VLisp内容如下
(vl-load-com)
(defun C:test(/ vla_obj_test file_obj) ;vla_obj_test是一个VLA对象,不同于Lisp里一些变量.
(setq vla_obj_test (vlax-create-object "dia_pro.dia_test"))
(setq file_obj (open (vlax-invoke-methodvla_obj_test 'dia_show_test) "r"))
(setq aa (read-line file_obj))
(setq bb (read-line file_obj))
(setq cc (read-line file_obj))
(close file_obj)
(princ (strcat "\n选取文件的前三行平均数为"
               (rtos (vlax-invoke-method
                       vla_obj_test
                       'get_average
                       (atof aa)
                       (atof bb)
                       (atof cc)
                     )
               )
       )
)
(princ)
)
;在看该程序时,可以使用VLisp的监视器观看一些ActiveX变量相关信息,便于理解.
;程序功能,读取一个文本文件的前三行,将其求平均数,并将结果打印出来.
;注意选取文件的类型及格式要正确,该程序对这部分的处理没有花功夫.

差不多了吧,其实efan版主的代码也是一样的,它写得更有代表性,调用API也是vlisp
做不到的(只是我不会API),差不多了吧,以后有时间看看lisp的书,不难的,可能
关于ActiveX这部分开始有些不适应,等你懂了后,你会。。。。 程序附上

mikewolf2k 发表于 2003-12-27 13:16:00

谢谢.等我的dll完全编完后再照样编一个lisp.到时候还不懂的话,再....不耻下问.....
页: 1 [2]
查看完整版本: DLL引用是不是只能用绝对路径??