求Delphi如何调用VB写的DLL。(3分)

  • 主题发起人 主题发起人 zpselect
  • 开始时间 开始时间
Z

zpselect

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,在DELPHI中如何调且一个VB写的DLL文件,这个DLL文件含有三个类,每一个类有各自的方法和属性,那么DELPHI要对DLL中某个类的属性进行赋值,以及调用某个类的方法进行相关操作!下面为VB环境中调用此DLL的程序代码,请问在DELPHI中又如何实现?
Private sub cmdSave_Click()
Dim objCn As Object
Dim strConn As String
Dim i As Integer
Dim strErrorNum As String
Dim strErrorDesc As String
Set objCn = CreateObject(“KISProfessionalPlugin.clsDataBase”)
‘//初始化数据库连接对象
objCn.InitConnection (strConn) ‘//strConn传入的数据库连接字符串
objCn.begin
Trans ‘//开始一个事务
‘//循环保存凭证,每次循环保存一张凭证。
For i = 0 To 3
If Not Savedata (i, strErrorNum, strErrorDesc) then
objCn.RollBackTrans’//出错回滚事务
MsgBox "保存第" &
i &
"个凭证失败!失败原因:错误号:" &
strErrorNum &
" 错 误描述:" &
strErrorDesc
Exit Sub
End If
Next
objCn.CommitTrans’//提交事务
Set objCn=Nothing
MsgBox "保存成功!"
End sub
 
VB 写的 DLL 和其他 DLL 有区别吗?
-------------------------------
我的Delphi博客: del.cnblogs.com
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=180533
 
我注册并安装这个DLL之后,程序就可以调用DLL中方法和属性了?另外,我有一不解,DELPHI怎么装载这个DLL文件?
 
我使用Project/Import Type Libbrary这个过程加载了那个DLL,但是不能Install
我点了CreateUntil之后,就将DLL变为PAS文件,可以看到里面的内容!
那么接下来如何做?小弟不才,望高手指点!
 
VB写的DLL和普通DLL没有什么区别吧。微软不会给自己旗下的软件制定不同标准的吧。
 
我把接口说明贴出来,看了就明白了!但是不无知如何下手!
接口插件名称为KISProfessionalPlugin.dll;该接口用到三个类,Voucher和VoucherEntry和clsDataBase。Voucher为’凭证头’类, VoucherEntry为凭证科目明细类(该类的对象作为类Voucher的一个属性使用),clsDataBase为数据库操作类。
下面为VB写的调用DLL的程序,但不知道在DELPHI如何调用4、
调用示列
Private sub cmdSave_Click()
Dim objCn As Object
Dim strConn As String
Dim i As Integer
Dim strErrorNum As String
Dim strErrorDesc As String
Set objCn = CreateObject(“KISProfessionalPlugin.clsDataBase”)
‘//初始化数据库连接对象
objCn.InitConnection (strConn) ‘//strConn传入的数据库连接字符串
objCn.begin
Trans ‘//开始一个事务
‘ //循环保存凭证,每次循环保存一张凭证。
For i = 0 To 3
If Not Savedata (i, strErrorNum, strErrorDesc) then
objCn.RollBackTrans’//出错回滚事务
MsgBox "保存第" &
i &
"个凭证失败!失败原因:错误号:" &
strErrorNum &
" 错误描述:" &
strErrorDesc
Exit Sub
End If
Next
objCn.CommitTrans’//提交事务
Set objCn=Nothing
MsgBox "保存成功!"
End sub
‘//保存凭证过程
Private Function Savedata(ByVal i As Variant, ByRef errornum As Variant, ByRef errorDesc As Variant) As Boolean
Dim obj As Object
Set obj = CreateObject (“KISProfessionalPlugin.Voucher”)
obj.VchGroup = "收"
obj.VchAttachment = 2
obj.VchDate = CDate("2006-07-25")

‘//下面的代码说明怎么新增一个凭证科目明细,注意:在为obj对象的属性VouchEntry赋值前,要先执行obj.InsertEntry(新增一个凭证科目明细对象)
‘//新增一个借方凭证科目明细
obj.InsertEntry
obj.VouchEntry(obj.nCount - 1).VchExp = "现金"
obj.VouchEntry(obj.nCount - 1).AcctID = " 1001.01"
obj.VouchEntry(obj.nCount - 1).VchDebit = 100
obj.VouchEntry(obj.nCount - 1).VchCyid = "RMB"
。。。。。。
‘//新增一个贷方凭证科目明细
obj.InsertEntry
obj.VouchEntry(obj.nCount - 1).VchExp = "销售出库"
obj.VouchEntry(obj.nCount - 1).AcctID = " 4101.03 "
obj.VouchEntry(obj.nCount - 1). VchCredit= 100 (注意这里和上面VchDebit不同)
obj.VouchEntry(obj.nCount - 1).VchCyid = "RMB"
obj.VouchEntry(obj.nCount - 1).ItemID = "152,100,162"
obj.VouchEntry(obj.nCount - 1).VchTransID = "343434"
。。。。。。
Savedata = obj.Save()’//保存
'//保存失败返回错误编号和错误描述
If Not Savedata then
errornum = obj.ErrNumber
errorDesc = obj.ErrDescription
End If
Set obj = Nothing
End function
 
vb的dll确实有点不同,
一般的dll加载和卸载时会触发,dll_procce_Attach,.....等4个事件。(VB的DllMain函数特别)
VB写的不会。
 
求将下面VB写的代码,改为DELPHI代码,我在DELPHI中曾改过,但是运行时报错!望各位帮助!
Private sub cmdSave_Click()
Dim objCn As Object
Dim strConn As String
Dim i As Integer
Dim strErrorNum As String
Dim strErrorDesc As String
Set objCn = CreateObject(“KISProfessionalPlugin.clsDataBase”)
objCn.InitConnection (strConn) ‘//strConn传入的数据库连接字符串
objCn.begin
Trans ‘//开始一个事务
For i = 0 To 3
If Not Savedata (i, strErrorNum, strErrorDesc) then
objCn.RollBackTrans’//出错回滚事务
End If
Next
objCn.CommitTrans’//提交事务
Set objCn=Nothing
End sub
 
哇塞,老大,我佩服你啊,DLL并非都是标准的,VB你可以封装一个类,Delphi你可以封装一个Form,但标准DLL 是不允许这些的,如果非要,你就要使用标准DLL Call 转换一下.
主要就是
1.function 参数 必须使用 pchar一类的东西,delphi,c,vb,他们处理string类型的方式不同
2.dll function procedure 引用两种,动态和静态,动态都用windows api的 loadlibray
静态就直接声明,不同语言不同
3.象string,class一类的东西,需要用标准函数转换,比如你想输出一个 string
delphi的DLL 中写法就是
private
FStr:string;//内部对象

function GetStr(var AStr:Pchar):boolean;
begin

StrCopy(AStr,pchar(FStr));
//转换成为标准DLL数据
end;

那么对象呢? 你的某语言写的对象必须在自己的空间里面建立,使用,释放
都通过标准function 来 call 就是了
比如
private
FFrm1:TForm;
...
function CreateAForm(ACaption:Pchar;hWnd:Handle;);
begin
application.createform(TForm,FFrm1);
end;

function ShowAForm(hWnd:Handle);
begin
end;

总之方法类似(只阐述方法,伪代码而已)
 
VB出来的DLL都是COM组件,你用COM方式调用很方便地
 
首先,我在当前电脑上面已经注册了VB写的DLL!
DELPHI的程序代码如下
procedure TForm1.BtnImputClick(Sender: TObject);
var
ObjDataBase: Olevariant;
begin
ObjDataBase := CreateOLEObject('KISProfessionalPlugin.clsDataBase');
ObjDataBase.InitConnection(ConnectionStr);
ObjDataBase.begin
Trans;
SQL语句块
ObjDataBase.CommitTrans;
end;
InitConnection,begin
Trans,CommitTrans方法是DLL的接口方法,说明书上是这么写的,而且我将VB写的那个DLL进么import Type Library /CreateUntil之后,产生PAS文件,在PAS中确实有这三个方法!
但是我在单步测试的时候,这个三个方法都是非法无效的!
end;
 
好像COM组件不能用CreateOLEObject,而是用CreateComObject。
 
那我该定义什么变量类型呢?
var
ObjDataBase: Olevariant;???什么变量类型?
 
直接定义成 variant 就行啊
 
不行的,改为variant 也是不行的
 
可否给几句成功的代码?谢谢!
 

Similar threads

I
回复
0
查看
770
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部