Пытаюсь понять внутреннее представление двухбайтовых строк во Free Pascal для использования в Компонентном Паскале внешней библиотеки (написанной на Free Pascal).
Допустим, есть такая библитека:
Код:
Library libtest;
procedure Demo (var b: PWideChar; a: PWideChar); export;
begin
//a := 'Hello'; // try to set initial value
b := PWideChar(WideString(a) + '?!');
end;
exports
Demo;
begin
end.
Теперь пишу на КП модуль описания этой демо-библиотеки:
Код:
MODULE TestLibDll ["libtest"];
TYPE
Pointer* = POINTER TO RECORD [untagged] END;
WideString* = ARRAY [untagged] OF CHAR;
PWideChar* = POINTER TO WideString;
PROCEDURE Demo* (VAR b: PWideChar; a: PWideChar);
END TestLibDll.
И сам проверочный модуль:
Код:
MODULE TestDll;
IMPORT SYSTEM, Lib := TestLibDll, Log := StdLog;
(* int - показывать ли строку также и в числовом виде *)
PROCEDURE WriteLn(IN s: ARRAY OF CHAR; int: BOOLEAN);
VAR i: INTEGER;
BEGIN
IF int THEN
FOR i := 0 TO LEN(s$) DO Log.Int(ORD(s[i])) END;
Log.Ln
END;
Log.String("=>" + s +"<="); Log.Ln;
END WriteLn;
PROCEDURE StrCpy(OUT dest: Lib.PWideChar; IN src: ARRAY OF CHAR);
VAR l: INTEGER;
BEGIN
WriteLn(" src ", FALSE);
WriteLn(src, FALSE);
dest := src;
WriteLn(" dest ", FALSE);
(*l := SYSTEM.ADR(dest); Log.Int(l); Log.Ln;*)
WriteLn(dest$, TRUE);
WriteLn(" end ", FALSE);
END StrCpy;
PROCEDURE Run*;
VAR
a, b: Lib.PWideChar;
s: ARRAY 64 OF CHAR;
BEGIN
StrCpy(a, "++++1234");
WriteLn("===== Demo", FALSE);
WriteLn(a$, TRUE);
b := NIL;
Lib.Demo(b, a);
WriteLn(b$, TRUE);
WriteLn("------ Demo", FALSE);
END Run;
END TestDll.
TestDll.RunИ получаю:
Код:
=> src <=
=>++++1234<=
=> dest <=
43 43 43 43 49 50 51 52 0
=>++++1234<=
=> end <=
=>===== Demo<=
43 43 43 43 49 50 51 52 0
=>++++1234<=
720 63 33 0
=>ː?!<=
=>------ Demo<=
Не пойму что я не учёл. Может, неправильно понял структуру PWideChar...