【发布时间】:2016-05-23 05:14:28
【问题描述】:
我用这段代码写了一个 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
在德尔福我有图书馆工作
type
TRegGetStr = Function(Const FullLocation_Name: String): String; StdCall;
var
aRegGetStr: TRegGetStr;
和
@aRegGetStr := Windows.GetProcAddress(LibHandle, 'RegGetStr');
我遇到了崩溃 是因为我使用的字符串类型吗?还是别的什么?
【问题讨论】:
-
是的,您的 Delphi 模块无法使用该代码,因为字符串类型对于互操作无效。
-
当然你可以从你的 Delphi 代码中读取注册表。你真的应该停止在 VB6 中编写新代码。你错过了备忘录吗?
-
IIRC,在 VB6 中,您可以与 PAnsiChar 互操作字符串,因此它可能应该类似于:
TRegGetStr = procedure(FullLocation_Name: PAnsiChar; Result: PAnsiChar) stdcall;,在 VB 端:Public Function RegGetStr(ByVal FullLocation_Name As String, ByVal Result As String),但我不完全确定。不过你应该试试。见here。 -
VB 不是像 VBA 一样支持 ActiveX 吗?也许可以使用 COM BSTR aka Delphi WideString?或 OleString ?
-
我见过的大多数例子都是用 C 语言编写并由 VB6 使用的 DLL。这:'void __export CALLBACK GetDiskInfo (char *cDrive, char *szVolumeName, unsigned long *ulFreeSpace)` 被转换为
Declare Sub getdiskinfo Lib "c:\somepath\diskinfo.dll" (ByVal mydrive As String, ByVal myvolume As String, free As Long)。反之亦然。