由来
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标记,嗯,挺好。还有图像、图表、公式挺多功能的,以后慢慢的努力丰富博文内容和表现形式。