Передача та отримання рядків із DLL
Привіт. Підкажіть, як нормально передавати рядки в DLL і назад
Підключення ShapeMem виключається оскільки незручно
Через Pchar не виходить, видає якісь крякозяблі: ( ShortString анологічно - крякозаблі.
Підказали передавати масив + розмір масиву а потім його відновлювати , але не можу розібратися як з масивами не працював нормально : (
> Через Pchar не виходить, видає якісь крякозяблі : > ( > ShortString анологічно - крякозаблі.Є пропозиція - навчитися передавати правильно, без кракозябліків.
Function ApiGetPath: pchar; external "my.dll";
procedure TForm1.Button1Click(Sender: TObject); begin Showmessage(ApiGetPath); end;
функція ApiGetPath: Pchar; stdcall; begin result := Pchar("C:\1111\222\333"); end;
У відповідь приходить або крякозяблі або літера С:)
А подивися, які методи передачі того-таки PChar"а в функціях WinAPI. Суть у тому, що PChar - це всього лише покажчик на якусь область пам'яті, в якій, ймовірно, буде знаходитися щось на кшталт "рядки", тобто. , друковані символи із завершальним символом із кодом 0.
функція ApiGetPath: Pchar; stdcall; const S = "c:\123\456"; begin GetMem (Result, Length(S)); StrCopy(Result,S) end;
procedure TForm1.Button1Click(Sender: TObject); var P: PChar; begin P := ApiGetPath; ShowMessage (P); FreeMem(P); end; Досить небезпечний підхід, загрожує витоком пам'яті, тому що легко забути звільнити пам'ять.
функція ApiGetPath2 (P: PChar): Integer; const S = "c:\123\456"; begin якщо P = nil then Result := Length(S) else begin StrCopy (P,S); Result: = 0; end; end;
procedureTForm1.Button1Click(Sender: TObject); var P: PChar; N: Integer; begin
N := ApiGetPath2(nil); GetMem (P, N); try ApiGetPath2(P); ShowMessage (P); finally FreeMem (P); end; end;
Переваги – пам'ять виділяється та звільняється в одному місці. Недоліки – деяка громіздкість.
Інші способи - комбінації та варіації цих основних. У такому аксепті, загалом, почитай хороші книги
--- Писав це все поспіхом, тому невиключені друкарські помилки, ляпи, описки і просто грубі помилки ;)
Дякую звичайно, розбиратимуся. Але всі до речі говорять що Pchar нормально передається.
Коли передаю рядок з DLL відмінно приймається рядок і все ніштяк. Коли ж передаю Рядок у DLL то вона приходить вже спотворена. :(
procedure texts(value:pchar); external "Project1.dll";
procedure TForm1.Button1Click(Sender: TObject); begin texts(Pchar("123")); end;
procedure texts(value:pchar); stdcall; begin Showmessage(StrPas(value)); end;
Млинець . невже не можна просто передати рядок млинців у DLL?
Возитимуся з пам'яттю :)
і пам'ятай - угоди про виклики мають бути однакові функції. Якщо вона у тебе в DLL описана як stdcall, то і в програмі, що викликає, теж повинна
> Підключення ShapeMem виключається оскільки незручно
Це що за монстр?
У цьому то й була вся проблама!! Дякую !
Усім дуже дякую ! :)
> У цьому то й була вся проблама!! Дякую !
Це зовсім не вся проблема. Читати [3] до просвітлення.