![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не получается в DLL, собранную на VCL, передать PStream.
DmiSb © (2005-04-01 07:59:00)Уважаемые мастера, очень нужна помошь.
DmiSb (2005-04-05 14:03:00) [1]2 ECM
Да уж. Круто. Что-то я совсем с этими потоками запарился. Видно я их не то чтобы плохо, я их совсе не понимаю. В VCL проще было.
Спасибо.
ECM (2005-04-05 13:55:00) [2]
Stream:=NewMemoryStream;
StrList.SaveToStream(Stream); // Данные из StrList в Stream.Memory
Sz := Stream.Size;
GetMem(Mem,Sz); // Mem - новый блок памяти (мусор)
Stream.Read(Mem^,Sz); // Из Mem (Мусор) в Stream.Memory
myLoadData(Mem, Sz); // Мусор в Длл
Ты наверное плохо понимаешь потоки - посмотри в KOL.pas
попробуй так:
Stream:=NewMemoryStream;
StrList.SaveToStream(Stream);
myLoadData(Stream.Memory, Stream.Size);
DmiSb (2005-04-05 13:46:00) [3]Еще одна интересная проблемка возникла:
Заполняю PStrList и сохраняю в PStream
Stream:=NewMemoryStream;
StrList.SaveToStream(Stream);
Sz := Stream.Size;
GetMem(Mem,Sz);
Stream.Read(Mem^,Sz);
myLoadData(Mem, Sz); //процедура в ДЛЛ
В ДЛЛ делаю обратную штуку
procedure myLoadData(Mem: Pointer; Siz: integer);stdcall;
var MStream: TMemoryStream;
DataList: TStringList;
begin
MStream:=TMemoryStream.Create;
MStream.SetSize(Siz);
Move(Mem^, MStream.Memory^, Siz);
DataList:=TStringList.Create;
DataList.LoadFromStream(MStream);
MStream.Free;
Так вот в результирующем DataList вместо строк крокозяблы какие-то. Что ж такое-то. Ну никак KOL c VCL дружить не хотят.
Что я опять не так делаю ?
DmiSb (2005-04-05 07:14:00) [4]Ну тады понятно.
Я пока второй вариант поковыряю, потом соображения намылю.
ECM (2005-04-05 06:44:00) [5]В КОЛ нет эквивалента Stream.LoadFromFile('1.txt');
надо делать иначе. Почитай
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1104391392&n=10
...
Письмо получил... времени углубленно посмотреть пока нехватает.
DmiSb (2005-04-05 06:20:00) [6]2 ЕСМ
Спасибо, действительно работает так.
Интересно, а почему в VCL такие выкрутасы не нужны. Прекрасно справляется код:
var Stream: TMemoryStream;
begin
Stream:=TMemoryStream.Create;
Stream.LoadFromFile('1.txt');
myLoadFromStream(Stream.Memory, Stream.Size);
Stream.Free;
Кстати, ты письмо с первым вариантом Фаста получил или нет ?
DmiSb (2005-04-05 06:19:00) [7]2 ЕСМ
Спасибо, действительно работает так.
Интересно, а почему в VCL такие выкрутасы не нужны. Прекрасно справляется код:
var Stream: TMemoryStream;
begin
Stream:=TMemoryStream.Create;
Stream.LoadFromFile('1.txt');
myLoadFromStream(Stream.Memory, Stream.Size);
Stream.Free;
Кстати, ты письмо с первым вариантом Фаста получил или нет ?
ECM (2005-04-04 18:19:00) [8]var Stream: PStream;
begin
Stream:=NewReadFileStream('1.txt');
myLoadFromStream(Stream.Memory, Stream.Size);
Stream.Memory = nil - ...
надо сначала прочитать куда-нибудь данные из файла:
var
Mem: Pointer;
Sz: Integer;
begin
Stream:=NewReadFileStream('1.txt');
Sz := Stream.Size;
GetMem(Mem,Sz);
Stream.Read(Mem^,Sz);
myLoadFromStream(Mem, Sz);
DmiSb (2005-04-04 14:52:00) [9]А теперь подробнее (может кто подскажет где я не прав):
В программе на КОЛ:
procedure myLoadFromStream(Mem: Pointer; Siz: integer);stdcall;
external 'myDLL.dll';
var Stream: PStream;
begin
Stream:=NewReadFileStream('1.txt');
myLoadFromStream(Stream.Memory, Stream.Size);
......
Stream.Free;
end;
В DLL написанной на VCL:
procedure myLoadFromStream(Mem: Pointer; Siz: integer);stdcall;
var MStream: TMemoryStream;
begin
MStream:=TMemoryStream.Create;
MStream.SetSize(Siz);
Move(Mem^, MStream.Memory^, Siz); //Здесь где-то ошибка
......
MStream.Free;
end;
Причем, если все на VCL, то работает.
Очень нужно. Облазил весь инет, но увы......
DmiSb (2005-04-01 14:38:00) [10]2 ЕСМ
Закинул еще в 10:30 сегодня. Неужто опять не дошло
ECM (2005-04-01 13:35:00) [11]Закинь мне на мыло этот проект...
И про FastReport можно.
thaddy (2005-04-01 09:00:00) [12]You can use the stream.memory and stream.size properties to create either a VCL memorystream on a KOL stream, or a KOL memorystream on a VCL stream. But you can also simply read/write with Both. Have you tried yet? It is easy.