Delphi DLL 与VB6 传送字符串

由来

InnoSetup有一个重要功能就是调用外部DLL,它本身是用Delphi写的,带的Script也基本上类同Delphi,因此,挂Delphi DLL比较好,只是自带的Sample太过简单。传值返值一般的计算功能调用还是比较简单,但传递字符串还是很不同。网上转了转,五花八门说啥的都有,我的解题可能不太一样。思路是这样的:VB6用Byref传送字符串,Delphi用Var p1: Pchar,接收字符串,在DLL中处理字符串,然后通过 Var p2: Pchar,返回给VB6; 要注意一是DLL接收了不要改变原来的内存地址或指针,即便在DLL做了很多处理,最后返时也只能是将处理过的内容考贝到原来的地址。二是本地处理后要有一块连续的内存将处理过的字符串放进去,再考贝给p2,于是呢,程序就写成下面的样子:

处理

Delphi程序DLL

Function BackString(var p1: PAnsichar; var p2: PAnsichar): Integer; stdcall;
  var
    s: string;
    p: Pchar;
begin
  s := 'abcdefg' + strPas(p1);
  p := StrAlloc(255);
  StrPcopy(p, s);
  strPCopy(p2, p);
  StrDispose(p);
  BackString :=0;
end;

VB6程序调用DLL

Declare Function BackString Lib "G:\MyDelphi2010\InstaDll\InstaDll.Dll" (ByRef a1 As String, ByRef a2 As String) As Long

......

Private Sub Command1_Click()
    S1$ = "123456789012345678901234567890"
    S2$ = String$(255, "a")
    List1.Clear
    r = BackString(S1$, S2$)
    List1.AddItem (CStr(1) + " " + Trim(S2$))
End Sub

注:VB6 做个FORM,上面放一个Command Button,再放一个ListBOx

结尾

在编程环境下运行,会在ListBox1上看到返回字符串 abcdefg1234567........,其中abcdefg是DLL加上去的、1234567......是VB6送给它的。字符串操作是借助于内存完成的,不管它怎么变,最后把整块内存的东西返回去就是了,否则很容易引发怪毛病,毕竟是在不同的开发环境约定下交互操作。

补充

如果VB6送整数和字符串,Delphi DLL可写为:

Function BackString1(intParam1: Integer; var p2: PAnsichar): Integer; stdcall;
  var
    s: string;
    p: Pchar;
begin
  s := 'abcdefg ' + IntToStr(intParam1) + ' abcdefg';
  p := StrAlloc(255);
  StrPcopy(p, s);
  strPCopy(p2, p);
  StrDispose(p);
  BackString1 :=0;
end;

VB6相应的写为

Declare Function BackString1 Lib "G:\MyDelphi2010\InstaDll\InstaDll.Dll" (ByVal a1 As Long, ByRef a2 As String) As Long

Delphi的Integer型在VB6里用Long型,用错了返回值由于溢出而成负数、返非所欲的。

CSDN用的不熟,加了粗体H3标记,嗯,挺好。还有图像、图表、公式挺多功能的,以后慢慢的努力丰富博文内容和表现形式。

猜你喜欢

转载自blog.csdn.net/weixin_45707491/article/details/109660429