任务很常见,虽然很容易完成。但经过3个小时的谷歌搜索,我放弃了。
我必须将字符串从MS Access VBA宏传递到Delphi DLL,以便使用Delphi DLL中的字符串进行操作。
环境:Delphi 2010,Access 2010
我也想避免使用ShareMem。
我的所作所为:
使用:
Option Compare Database
Private Declare Function callForm Lib "C:\Programing\_contract\MyWork_2014\AccessDLL\build\access.dll" (ByRef par As Variant) As Long
Private Sub Button0_Click()
MsgBox callForm("alex")
End Sub
Delphi DLL:
function callForm(par: PChar): Integer; export; stdcall;
var
buf: PWideChar;
s: String;
rs: RawByteString;
begin
frmAccessTest.Caption := par;
frmAccessTest.ShowModal;
Result := 456;
end;
结果我的表格有错误的标题。 我该怎么办才能让它发挥作用?
答案 0 :(得分:2)
我不确定您为何尝试使用变量来传递字符串。在我看来传递一个字符串更合理。这样做:
Declare
语句以将参数类型指定为ByVal par As String
。 PChar
更改为PAnsiChar
。对于您的Unicode Delphi PChar
是PWideChar
的别名。 顺便说一下,请注意Delphi export
指令被忽略。你应该删除它。
答案 1 :(得分:0)
Delphi和VBA都支持变体 将字符串作为VBA中的变体传递并将其作为Delphi中的变体读取应该可以解决您的问题。
因此将Delphi例程重新定义为:
function callForm(par: Olevariant): Integer; stdcall;
begin
frmAccessTest.Caption := par;
frmAccessTest.ShowModal;
Result := 456;
end;
确保A:使用OleVariant
并且永远不会返回(Ole)variant
如果要返回结果,请执行以下操作:
procedure ReturnAString(A: integer; out B: OleVariant); stdcall;
不要忘记在VBA中设置ByVal
传递的参数:
Private Declare Function callForm Lib "path.dll" (ByVal par As Variant) As Long