Kłopot z PChar w DLL

0

Witam, jak robiłem to w konsoli na stringach to wszystko działało.

type
  TLibTab= array [1..3] of array [1..3] of byte;

function ArrayToPChar(tab: TLibTab): PChar; stdcall;
var
  i,j: byte;
  s: string;
begin
  for i := high(tab) downto low(tab) do
    begin
      if (i mod 2 = 0) then
      begin
        for j := high(tab) downto low(tab) do
        begin
          s := s+inttostr(tab[j,i]);
        end;
      end else
      begin
        for j := low(tab) to high(tab) do
        begin
          s := s+inttostr(tab[j,i]);
        end;
      end;
    end;
    result := PChar(s);
end;

function PCharToArray(tekst: PChar): TLibTab stdcall;
var
  i,j,k: byte;
  tab: TLibTab;
begin
  k := 1;
  for i := high(tab) downto low(tab) do
    begin
      if (i mod 2 = 0) then
      begin
        for j := high(tab) downto low(tab) do
        begin
          tab[i,j] := StrToInt(tekst[k]);
          k := k+1;
        end;
      end else
      begin
        for j := low(tab) to high(tab) do
        begin
          tab[i,j] := StrToInt(tekst[k]);
          k := k+1;
        end;
      end;
    end;
    result := tab;
end;

procedure zrob(tab: TLibTab); stdcall;
var
  tekst: PChar;
  tab1: TLibTab;
  i,j: byte;
begin
  tekst := ArrayToPchar(tab);
  MessageBox(0, tekst, 'Hello', MB_OK + MB_ICONINFORMATION);
  tab1 := PCharToArray(tekst);
end;

ArrayToPChar działa bez problemów. Problem pojawia do dopiero przy PCharToArray jedyne co się pojawia to okienko błedu z tym czerwonym X o treści

'

Ps. przy okazji spytam bo jeszcze z tym nie próbowałem. Czy da się wywołać dll w dll (w jednej dll chce użyć procedur z innej dll)

0
  1. zważ, że zmienne lokalne są odkładane na stosie i po wyjściu z bloku (procedury/funkcji/...) są tracone, a to
result := PChar(s);

do result przypisuje po prostu adres zmiennej s, której nie ma po wyjściu z procedury. Musisz "ręcznie" zaallokować pamięc dla PChara
2. da się

0

Hmm nadal mam problem z tym przydzielaniem pamięci :/

wywołanie funkcji z formy.

procedure TForm1.Button3Click(Sender: TObject);
var
  tablica: TLibTab;
  i,j: byte;
  s: string;
begin
tablica := zrob2(PChar('369852147'));
for I := low(tablica) to high(tablica) do
begin
  for j := low(tablica) to high(tablica) do
  begin
    s := s+inttostr(tablica[i,j]);
  end;
end;
 MessageBox(0, PChar(s), 'Zrob2', MB_OK + MB_ICONINFORMATION);
end;

DLL

function PCharToArray(tekst: shortstring): TLibTab stdcall;
var
  i,j,k: byte;
  tab: TLibTab;
begin
  ............
end;

function zrob2(tekst: PChar): TLibTab; stdcall;
var
  temp: pchar;
  tab: TLibTab;
begin
GetMem(temp, sizeof(tekst));
tab := PCharToArray(temp);
freemem(temp);
result :=  tab;
end;

I niestety zrob2 nie działa jak powinno, wiem że jest to problem z przydzielaniem pamięci bo jak zrobiłem sobie to na shortstringach to działało. Jednak nie wiem jakiej długości będzie zmienna tekst i najprawdopodobniej niejednokrotnie nie zmieści się w tych 255 znakach shortstringa:/

1 użytkowników online, w tym zalogowanych: 0, gości: 1