我用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)求高手指点为谢!

解决方案 »

  1.   

    不要传字符串。
    vb中的String类型和其他语言是不同的。
    最好传Long,肯定可以。
      

  2.   

    因为vb对字符串在后台做Unicode到ansi的转换,所以会有一定的问题,你必须自己处理.
    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
      

  3.   

    VB里的String用Delphi或CBuilder的PChar对应,其它的语言,偶就未知道了.
      

  4.   

    同意不文用varptr的copy方法,但不排除其它解决方法,你可以试试用byref传入一个class映射,然后在程序私有方法利用接口解法这个问题
    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
      

  5.   

    vb中的String类型和其他语言是不同的。
    传一个Long过来,就是String的地址,而且这个String要求是一个BSTR字符串
    看一下BSTR字符串的格式
    http://dev.csdn.net/develop/article/57/article/55/55236.shtm
      

  6.   

    naokizxx(被迫VB) :你好,你说的方法能给个具体的VB源码吗?
      

  7.   

    unsigned(僵哥) :在vb里面怎么用Pchar啊?
      

  8.   

    msdn里面有sample是一篇关于恐龙攻击的源码用接口实现,
    你照做完就OK了
    在msdn里面搜索中文内容,索引中填"多态",“定义的”,"多态","创建实现接口",里面有完整的例子代码,照抄就行了
      

  9.   

    VB里的String 对应VC的BSTR.对字符串用ByRef试试
      

  10.   

    好象Vb的Dll只能自用。
    请各位发表意见!
      

  11.   

    用ByRef试过了,但是只能传递数值型,还是不能传递字符窜,痛中
      

  12.   

    to bingshui() 
    你是用什么语言调用的,我用C语言调用发现有问题,非法操作
      

  13.   

    这个问题我以前也有问过,别人的回答也是传地址过去,再返回字符串长度,就像SendMessage一样.但你的问题在于,你的DLL是一个VB做的"另类"DLL啊,又不是标准DLL,又不是标准的ActiveXDLL,也许在这里面出了问题.
      

  14.   

    虽然是有输出函数
    不过VB所使用的数据类型是VB特有的 
    并不是每个数据类型都和其他的语言通用
    VB里long 和 integer 都和其他语言的不一样 
    占用的字节也不一样,所以就会出现内存不可读
    是超出占用字节的上限,有点像溢出 
      

  15.   

    也许VB的DLL不作处理,只能在VB里调用吧.其他语言里,如果作一定的处理不知道能不能用.只能想办法不传字符串罗
      

  16.   

    to asmgirl(过期菜鸟):我是用delpai和PB调用出错的。
    pikachu8guan的话有点道理。虽然我已经改用delpai来写dll了,但是为VB写dll出现的错误不能被其他语言调用的问题而感到万分痛心。
    唉~散分吧。
      

  17.   


    有话要说:
    关于“Vb的Dll只能自用”的问题,我逛applevb.com(作vb的都知道)的时候发现了答案:VB完全可以生成供Vc delphi等使用的dll文件!
    在编译时,加上 “/export 函数名称”即可。
    我长叹一声,困扰了我3年之久的问题终于解决了。在applevb.com的主页上就有这篇文章,大家可以去看。
    (给不给分啊?我的心理很脆弱的....)