我用VB写了个测试的123.dll(用论坛提供的Link编译过,可以输出函数),只有一个函数,在VB能够正常调用,但是在PB或delphl中调用却出现“内存不能read的错误”,如下图,不知道是怎么回事,望高手指点!
此主题相关图片如下:
123.dll源代码:
Option Explicit
Public Function Aboutme(ByVal Mydll As String) As String
MsgBox Mydll
If Mydll <> "" Then
Aboutme = "调用成功!"
Else
Aboutme = "空值!"
End If
End Function点击下载123.dll
点击浏览该文件: http://club.5ivb.net/UploadFile/200519194039byUID17077.rar123.dll在VB的调用方法:
Declare Function Aboutme Lib "123.dll" (ByVal Mydll As String)求高手指点为谢!
此主题相关图片如下:
123.dll源代码:
Option Explicit
Public Function Aboutme(ByVal Mydll As String) As String
MsgBox Mydll
If Mydll <> "" Then
Aboutme = "调用成功!"
Else
Aboutme = "空值!"
End If
End Function点击下载123.dll
点击浏览该文件: http://club.5ivb.net/UploadFile/200519194039byUID17077.rar123.dll在VB的调用方法:
Declare Function Aboutme Lib "123.dll" (ByVal Mydll As String)求高手指点为谢!
vb中的String类型和其他语言是不同的。
最好传Long,肯定可以。
Public Function Aboutme(ByVal Mydll As Long) As Long
Dim buf As String
buf = vbNullString
CopyMemory ByVal VarPtr(buf), Mydll, 4
If Mydll <> "" Then
Aboutme = 1
Else
Aboutme = 0
End If CopyMemory ByVal VarPtr(buf), 0&, 4 End Function
msdn例:
下面的共享声明的代码位于称为 PersonalData 的类中:Public Name As String
Public Address As String有关处理客户数据的代码位于 Customer 类模块:Implements PersonalData
Private Property Get PersonalData_Address() As String
PersonalData_Address = "CustomerAddress"
End PropertyPrivate Property Let PersonalData_Address(ByVal RHS As String)
'
End PropertyPrivate Property Let PersonalData_Name(ByVal RHS As String)
'
End PropertyPrivate Property Get PersonalData_Name() As String
PersonalData_Name = "CustomerName"
End Property有关处理供应商数据的代码位于 Supplier 类模块:Implements PersonalDataPrivate Property Get PersonalData_Address() As String
PersonalData_Address = "SupplierAddress"
End PropertyPrivate Property Let PersonalData_Address(ByVal RHS As String)
'
End PropertyPrivate Property Let PersonalData_Name(ByVal RHS As String)
'
End PropertyPrivate Property Get PersonalData_Name() As String
PersonalData_Name = "SupplierName"
End Property下面的代码负责处理 Selector 窗体:Private cust As New Customer
Private sup As New SupplierPrivate Sub Command1_Click()
Dim frm2 As New Form2
Set frm2.PD = cust
frm2.Show 1
End SubPrivate Sub Command2_Click()
Dim frm2 As New Form2
Set frm2.PD = sup
frm2.Show 1
End Sub下面的代码负责处理 Data Entry 窗体:Private m_pd As PersonalData
Private Sub Form_Load()
With m_pd
Text1 = .Name
Text2 = .Address
End With
End Sub
Public Property Set PD(Data As PersonalData)
Set m_pd = Data
End Property
传一个Long过来,就是String的地址,而且这个String要求是一个BSTR字符串
看一下BSTR字符串的格式
http://dev.csdn.net/develop/article/57/article/55/55236.shtm
你照做完就OK了
在msdn里面搜索中文内容,索引中填"多态",“定义的”,"多态","创建实现接口",里面有完整的例子代码,照抄就行了
请各位发表意见!
你是用什么语言调用的,我用C语言调用发现有问题,非法操作
不过VB所使用的数据类型是VB特有的
并不是每个数据类型都和其他的语言通用
VB里long 和 integer 都和其他语言的不一样
占用的字节也不一样,所以就会出现内存不可读
是超出占用字节的上限,有点像溢出
pikachu8guan的话有点道理。虽然我已经改用delpai来写dll了,但是为VB写dll出现的错误不能被其他语言调用的问题而感到万分痛心。
唉~散分吧。
有话要说:
关于“Vb的Dll只能自用”的问题,我逛applevb.com(作vb的都知道)的时候发现了答案:VB完全可以生成供Vc delphi等使用的dll文件!
在编译时,加上 “/export 函数名称”即可。
我长叹一声,困扰了我3年之久的问题终于解决了。在applevb.com的主页上就有这篇文章,大家可以去看。
(给不给分啊?我的心理很脆弱的....)