vb6 dll在Delphi中

时间:2016-05-23 05:14:28

标签: delphi vb6

我用这段代码写了一个VB6 dll

Public Function RegGetStr(ByRef FullLocation_Name As String) As String
   Dim oReg As Object
    Set oReg = CreateObject("WScript.Shell")
    RegGetStr = oReg.RegRead(FullLocation_Name, "REG_SZ")

    Set oReg = Nothing
End Function

在Delphi中,我有图书馆工作

type
          TRegGetStr = Function(Const FullLocation_Name: String): String; StdCall;
    var
     aRegGetStr: TRegGetStr;

 @aRegGetStr := Windows.GetProcAddress(LibHandle, 'RegGetStr');

我崩溃了 是因为我使用的字符串类型?或其他什么?

1 个答案:

答案 0 :(得分:0)

您的问题是关于从Delphi调用VB DLL的问题。 VB6,开箱即用,创建ActiveX DLL(作为ActiveX DLL项目创建)   How can I create a standard DLL in VB6?看看那里描述ActiveX DLL的答案。

虽然您可以在VB6中创建标准DLL,但您必须进行探险。它不支持开箱即用,不推荐使用。

您将使用该VB ActiveX DLL,就像使用Delphi中的任何ActiveX DLL一样  Deplhi Import Component - Type Library vs ActiveX

=====

另一方面,如果你试图调用一个外部DLL(例如用Delphi编写) FROM 一个VB应用程序,你可以用字符串的pAnsiChar参数创建Delphi函数。例如:在MyDelProcs.dll中:

procedure MyDelProc(pStr1: pAnsiChar, MyInt: integer);stdcall;
  .......................
exports
  MyDelProc;

在VB端,您将声明该过程为

宣布Sub MyDelProc Lib" MyDelProcs.dll" (ByVal sStr1 as String,MyLong As Long)

然后用

调用该过程
   Call MyDelProc(sStr1, MyLong)

一些注意事项:

  1. sStr1是VB内部的Unicode,但在调用时转换为AnsiString。 ansistring在末尾添加了一个chr(0)并移动到一个缓冲区,该缓冲区是ansistring的长度加上chr(0)。

  2. 注意其他参数类型。 VB中的默认整数是2个字节,Delphi中的默认整数是4,相当于VB中的Long类型。

  3. 如果您的Delphi函数需要知道长度,请将其作为另一个(长整数)参数传递。

  4. 字符串缓冲区的大小是固定的。如果你要返回一个较长的字符串,那么要用足够的空间填充原始字符串,或者传递一个长度足够长的虚拟字符串以便返回。

  5. 返回时,字符串被视为ansistring。它将被转换回Unicode以放入VB内部字符串。