Mảng chuỗi động đã là một mảng của PWideChar/PAnsiChar
(đối với WideString or UnicodeString/AnsiString
).
mảng động này có thể được ánh xạ trực tiếp như là, không có bản sao bộ nhớ, từ hầu hết các ngôn ngữ, như là một mảng của PWideChar/PAnsiChar
:
Từ người gọi:
DLLFunction(length(templates),pointer(templates));
Từ dll:
type
TPAnsiCharArray = array[0..MaxInt div SizeOf(PAnsiChar)-1] of PAnsiChar;
PPAnsiCharArray = ^TPAnsiCharArray;
TPWideCharArray = array[0..MaxInt div SizeOf(PWideChar)-1] of PWideChar;
PPWideCharArray = ^TPWideCharArray;
procedure DLLFunction(argc: integer; argv: PPWideCharArray);
var i: integer;
begin
for i := 0 to argc-1 do
writeln(argv[i]);
end;
Ví dụ: từ dll C, bạn có thể sử dụng char **argv
thay vì PPAnsiCharArray
và void **argv
thay vì PPWideCharArray
.
Sau đó, bạn có thể dễ dàng chuyển đổi lại PWideChar/PAnsiChar
thành loại chuỗi gốc của ngôn ngữ.
Nếu bạn chỉ cần phải viết một dll Delphi, bạn có thể sử dụng
type
TAnsiStringArray = array[0..MaxInt div SizeOf(AnsiString)-1] of AnsiString;
PAnsiStringArray = ^TAnsiStringArray;
TWideStringArray = array[0..MaxInt div SizeOf(WideString)-1] of WideString;
PWideStringArray = ^TWideStringArray;
procedure DLLFunction(argc: integer; argv: PWideStringArray);
var i: integer;
begin
for i := 0 to argc-1 do
writeln(argv[i]);
end;
hoặc thậm chí
DLLFunction(templates);
procedure DLLFunction(const templates: array of WideString);
var i: integer;
begin
for i := 0 to high(templates) do
writeln(templates[i]);
end;
Nguồn
2011-05-05 15:57:08
@ user740144, Đừng quên khai báo chức năng/procs xuất khẩu của bạn là 'stdcall' nếu bạn muốn sử dụng nó dll với khách hàng không delphi. – Johan
@Johan Bạn có thể sử dụng 'stdcall' hoặc' cdecl'. 'stdcall' sẽ hơi tiêu chuẩn trong Windows, nhưng' cdecl' cũng có thể có ý nghĩa. Quy ước '__fastcall' không chuẩn. –