Предаване и получаване на низове от DLL
Поздравления. Кажете ми как нормално да предавам низове на DLL и обратно
Свързването на ShapeMem е изключено, тъй като е неудобно
Не работи през Pchar, издава някакви кракове :( ShortString е подобен - кракове.
Те предложиха предаване на масив + размер на масива и след това възстановяването му, но не мога да разбера как, тъй като не работи нормално с масиви :(
> Не работи през Pchar, издава някакви кракове: > ( > ShortString е аналогичен - кодиран.Има предложение - да се научите как да предавате правилно, без скрабли.
Функция ApiGetPath:pchar; външен "my.dll";
procedure TForm1.Button1Click(Sender: TObject); begin Showmessage(ApiGetPath); end;
функция ApiGetPath: Pchar; stdcall; начало резултат := Pchar("C:\1111\222\333"); край;
Отговорът идва или крякозябли, или буквата С :)
И вижте какви са начините за предаване на същия PChar "a във функциите на WinAPI. Основното е, че PChar е просто указател към определена област от паметта, в която, вероятно, ще има нещо като "низ", т.е. печатни символи със завършващ знак с код 0.
функция ApiGetPath: Pchar; stdcall; const S = "c:\123\456"; begin GetMem(Резултат, Дължина(S)); StrCopy(Резултат,S) край;
procedure TForm1.Button1Click(Sender: TObject); var P: PChar; begin P := ApiGetPath; Покажи съобщение(P); FreeMem(P); край; Доста опасен подход, изпълнен с изтичане на памет, защото е лесно да забравите да освободите памет.
функция ApiGetPath2 (P: PChar): Integer; const S = "c:\123\456"; begin if P = nil then Result := Length(S) else begin StrCopy (P,S); Резултат := 0; край; край;
процедураTForm1.Button1Click(Подател: TObject); var P: PChar; N: Цяло число; начало
N := ApiGetPath2(нула); GetMem(P, N); опитайте ApiGetPath2(P); Покажи съобщение(P); накрая FreeMem(P); край; край;
Предимства - паметта се заделя и освобождава на едно място. Недостатъци - известна обемност.
Останалите методи са комбинации и вариации на тези основни. В това приемане като цяло четете добри книги :)
--- Написах всичко набързо, така че не са изключени печатни грешки, гафове, пропуски и просто груби грешки;)
Благодаря ви, разбира се, ще го разгледам. Но между другото всички казват, че Pchar се предава нормално.
Когато подавам низ от DLL, низът се получава перфектно и всичко е наред. Когато предам низа на DLL, той идва вече изкривен. :(
текст на процедурата (стойност:pchar); външен "Project1.dll";
procedure TForm1.Button1Click(Sender: TObject); begin texts(Pchar("123")); end;
текст на процедурата (стойност:pchar); stdcall; начало Покажи съобщение(StrPas(стойност)); край;
глупости . Не е ли възможно просто да прехвърлите проклетия ред на DLL?
Ще си бъркам в паметта :)
и запомнете - конвенциите за извикване трябва да са еднакви за дадена функция. Ако е описано във вашата DLL като stdcall, тогава трябва да е и в извикващата програма
> Връзката с ShapeMem е изключена, защото е неудобна
Какво е това чудовище?
Това беше целият проблем!! Благодаря ти !
Много ви благодаря на всички! :)
> Това беше целият проблем!! Благодаря ти !
Това изобщо не е целият проблем. Прочетете [3], докато не станете просветени.