![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как возвратить строку из dll без ShareMem? [D7, 95/98, ME]
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