[Delphi] Problem z przekazywaniem short stringa do dllki

0

Mam dosyć dziwny problem. W bibliotece posiadam funkcje która ma <ort>znaleŹć </ort>pierwsza nieużywaną nazwę pliku w folderze (czyli jak w folderze sa pliki tekstowe: 1.txt, 2.txt, 5.txt funkcja zwróci wartość 3).
Oto jej kod:

function WolneMiejsce(SDWiadomosci,Rozszerzenie : ShortString) : integer;
var
S : String;
Path: String;
Rec  : TSearchRec;
a : integer;
begin
//znajdz nazwe pliku ktora jest wolna
S:= '';
for a:= 1 to 1000 do
  begin
  Path:= IncludeTrailingBackslash(SDWiadomosci);
  if FindFirst(Path + IntToStr(a) + Rozszerzenie, faAnyFile - faDirectory, Rec) = 0 then
    try
      repeat
        S:= (path + Rec.Name);
      until FindNext(Rec) <> 0;
    finally
      FindClose(Rec);
    end;
  if S = '' then Break else S:= '';
  end;
Result:= a;
end;

Tak jest zadeklarowana:

function WolneMiejsce(SDWiadomosci, Rozszerzenie : ShortString) : integer; stdcall external 'Biblioteka.dll' name 'WolneMiejsce';

I teraz mam taki problem że gdy wywołuję funkcje i przekazuje parametry to pierwszy jest dobry (c:\wiadomosci) a drugi zamiast byc .txt to jest :\wiadomosci#13#23#19#13 (cos w tym stylu nie pamietam dokladniej ale tych liczb z # jest wiecej).
I mam teraz takie pytanie co jest nie tak [???]

0

zamiast ShortString PChar

0

Teraz zmienna Rozszerzenie jest 'nil' [???]

0

może byś tak dał kod jak to wywołujesz

0
function WolneMiejsce(SDWiadomosci,Rozszerzenie : ShortString) : integer;

Jeśli ta funkcja jest w DLL'ce, to nie powinno być:

function WolneMiejsce(SDWiadomosci,Rozszerzenie : ShortString) : integer; stdcall;
0

Tera po zmianie w dll mam:

function WolneMiejsce(SDWiadomosci,Rozszerzenie : PChar) : integer;

A w formie w której to używam to mam:

function WolneMiejsce(SDWiadomosci, Rozszerzenie : PChar) : integer; stdcall external 'Biblioteka.dll' name 'WolneMiejsce';

A jeżeli chodzi o wywołanie to wygląda to tak:

var
SDWiadomosci, Rozszerzenie : String;
Numer : Integer;
begin
...
SDWiadomosci:= 'c:\wiadomosci';
Rozszerzenie:= '.txt';
...
Numer:= WolneMiejsce(SDWiadomosci, Rozszerzenie);
...
end;
0

poczytaj Biblioteki DLL

0

zmień deklarację w unicie z formą na :

function WolneMiejsce(SDWiadomosci, Rozszerzenie : PChar) : integer; external 'Biblioteka.dll' name 'WolneMiejsce';
0

Wielkie dzięki, już dziala xD

0

Nie ma sprawy, po prostu w stdcall parametry są kładzione na stos od końca, a w register pierwsze trzy do kolejno EAX, EBX, EDX, a 4. i następne na stos od lewej do prawej.

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