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

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

Не получается в 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.


Наверх

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