如何将字符串从VBA传递到Delphi DLL,避免使用ShareMem?

时间:2014-05-11 10:08:03

标签: vba delphi dll

任务很常见,虽然很容易完成。但经过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;

结果我的表格有错误的标题。 我该怎么办才能让它发挥作用?

2 个答案:

答案 0 :(得分:2)

我不确定您为何尝试使用变量来传递字符串。在我看来传递一个字符串更合理。这样做:

  1. 更改VBA Declare语句以将参数类型指定为ByVal par As String
  2. 将Delphi参数从PChar更改为PAnsiChar。对于您的Unicode Delphi PCharPWideChar的别名。
  3. 顺便说一下,请注意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

另请参阅:How do I (or if I can't) use Variants on simple DLLs?