Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как возвратить строку из dll без ShareMem? [D7, 95/98, ME]


Страницы:   1 2

AMW ©   (2007-03-04 21:34:00) 

Мне нужно возвратить строку из процедуры/функции dll, как это сделать не подключая ShareMem?
Заранее спасибо!


Leonid Troyanovsky   (2007-03-05 11:28:00) [21]


> SlymRO ©   (05.03.07 11:22) [13]

> пример панацеи widestring:

Чего-то мутно.
Да и не должны мы в subject константы разбирать.

--
Regards, LVT.


SlymRO   (2007-03-05 11:22:00) [22]

пример панацеи widestring:
program Project2;

{$APPTYPE CONSOLE}

uses SysUtils;

const TestStr='hello world';

function TestProc:PWidestring;
var temp:widestring;
begin
 temp:=TestStr;
 result:=@temp;
end;

var temp:widestring;
begin
 temp:=TestProc()^;
 if temp<>teststr then
   writeln('Not EQ')
 else
   writeln('EQ!');
end.


Leonid Troyanovsky   (2007-03-05 11:22:00) [23]


> SlymRO ©   (05.03.07 11:13) [11]

> а то что WideString values are not reference-counted еще  не выход

Там дело в том, что оные строки распределяются не
дельфийским менеджером, а, скажем так, через COM.

--
Regards, LVT.


SlymRO   (2007-03-05 11:13:00) [24]

Аноним   (05.03.07 10:36) [10]
Самый простой способ: это стандартизация соглашений о вызове процедур и о порядке освобождения ресурсов.
а то что WideString values are not reference-countedеще не выход


Аноним   (2007-03-05 10:36:00) [25]

Самый простой способ (если не хватает опыта разрулиться с указателями и выделениями памяти) - вместо Stringиспользовать WideString


SlymRO   (2007-03-05 09:54:00) [26]

аля WinApi
function TestProc(buf:PChar;bufSize:integer):integer; stdcall;
var s: string;
begin
 s := 'Test';
 result:=Length(s)+1;
 if bufSize=0 then exit;
 if result>bufSize then
   result:=bufSize;
 StrLCopy(buf,PChar(s),result-1);
end;


begin...end   (2007-03-05 08:52:00) [27]

procedure TestProc(var buf: PChar); stdcall;
var
 s: string;
begin
 s := 'Test';
 Move(s[1], buf^, Length(s) + 1)
end


Loginov Dmitry   (2007-03-05 07:54:00) [28]

procedure TestProc(buf: PChar); stdcall
var
  s: string;
begin
  s := 'Test';
  MoveMemory(Pointer(s), buf, Length(s));
  buf[Length(s)] := #0;
end;


TRUNK   (2007-03-05 00:49:00) [29]

> TRUNK ©  [4]
Ещё одна ошибка :((

Move(s[1],buf^,Length(s));
или
MoveMemory(@s[1],buf,Length(s));


TRUNK   (2007-03-05 00:43:00) [30]

> TRUNK ©  [4]
Ошибочка вышла :(

TestProc( @buf);


TRUNK   (2007-03-05 00:41:00) [31]

procedure TestProc( buf: PChar); stdcall
var
s: string;
begin
s := 'Test';
Move(s[1], buf,Length(s));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
buf: array[0..9] of Char;
begin
FillChar(buf,SizeOf(buf),0);
TestProc(buf);
Edit1.Text := buf;
end;


AMW   (2007-03-05 00:17:00) [32]

Написал так:
// DLL

library Project2;

uses
 SysUtils, Windows;

procedure TestProc(var buf: PChar); stdcall
var
 s: string;
begin
 s := 'Test';
 Move(s[1],buf^,Length(s));
end;

exports
 TestProc Name 'TestProc';
end.

// В программе:
procedure TestProc(var buf: PChar); stdcall; external 'Project2.dll';

procedure TForm1.Button2Click(Sender: TObject);
var
 buf: PChar;
begin
 GetMem(buf,10);
 TestProc(buf);
 Edit1.Text := buf;
 FreeMem(buf);
end;

В Edit записывается строка "Testð


Loginov Dmitry   (2007-03-04 23:27:00) [33]

Очень просто. Резервируешь заранее место под строку необходимого размера, затем вызваешь функцию из DLL и передаешь в нее адрес строки в виде PChar.


Palladin   (2007-03-04 21:53:00) [34]

использовать PChar


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо