我用这段代码写了一个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');
我崩溃了 是因为我使用的字符串类型?或其他什么?
答案 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)
一些注意事项:
sStr1是VB内部的Unicode,但在调用时转换为AnsiString。 ansistring在末尾添加了一个chr(0)并移动到一个缓冲区,该缓冲区是ansistring的长度加上chr(0)。
注意其他参数类型。 VB中的默认整数是2个字节,Delphi中的默认整数是4,相当于VB中的Long类型。
如果您的Delphi函数需要知道长度,请将其作为另一个(长整数)参数传递。
字符串缓冲区的大小是固定的。如果你要返回一个较长的字符串,那么要用足够的空间填充原始字符串,或者传递一个长度足够长的虚拟字符串以便返回。
返回时,字符串被视为ansistring。它将被转换回Unicode以放入VB内部字符串。