Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.27;
Скачать: CL | DM;

Вниз

Не получается в DLL, собранную на VCL, передать PStream.   Найти похожие ветки 

 
DmiSb   (2005-04-01 07:59) [0]

Уважаемые мастера, очень нужна помошь.


 
thaddy   (2005-04-01 09:00) [1]

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.


 
ECM ©   (2005-04-01 13:35) [2]

Закинь мне на мыло этот проект...
И про FastReport можно.


 
DmiSb   (2005-04-01 14:38) [3]

2 ЕСМ
Закинул еще в 10:30 сегодня. Неужто опять не дошло


 
DmiSb   (2005-04-04 14:52) [4]

А теперь подробнее (может кто подскажет где я не прав):

В программе на КОЛ:

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, то работает.

Очень нужно. Облазил весь инет, но увы......


 
ECM ©   (2005-04-04 18:19) [5]

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-05 06:19) [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:20) [7]

2 ЕСМ
Спасибо, действительно работает так.
Интересно, а почему в VCL такие выкрутасы не нужны. Прекрасно справляется код:

var Stream: TMemoryStream;
begin
 Stream:=TMemoryStream.Create;
 Stream.LoadFromFile("1.txt");
 myLoadFromStream(Stream.Memory, Stream.Size);
 Stream.Free;

Кстати, ты письмо с первым вариантом Фаста получил или нет ?


 
ECM ©   (2005-04-05 06:44) [8]

В КОЛ нет эквивалента Stream.LoadFromFile("1.txt");
надо делать иначе. Почитай
http://delphimaster.net/view/11-1104391392/
...
Письмо получил... времени углубленно посмотреть пока нехватает.


 
DmiSb   (2005-04-05 07:14) [9]

Ну тады понятно.
Я пока второй вариант поковыряю, потом соображения намылю.


 
DmiSb   (2005-04-05 13:46) [10]

Еще одна интересная проблемка возникла:

Заполняю 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 дружить не хотят.
Что я опять не так делаю ?


 
ECM ©   (2005-04-05 13:55) [11]

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 14:03) [12]

2 ECM
Да уж. Круто. Что-то я совсем с этими потоками запарился. Видно я их не то чтобы плохо, я их совсе не понимаю. В VCL проще было.
Спасибо.



Страницы: 1 вся ветка

Текущий архив: 2005.11.27;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.026 c
4-1127596252
GuAV
2005-09-25 01:10
2005.11.27
EMF - изменение записей - как заполнить intercharacter spacing ?


14-1130920332
kaif
2005-11-02 11:32
2005.11.27
Задачка про доску


14-1131017255
Falcon(TFsoft)
2005-11-03 14:27
2005.11.27
Button1Click at runtime....


2-1131438558
DevMaster
2005-11-08 11:29
2005.11.27
TadvStringGrid (TMS) - проблемма с памятью


14-1131356879
_Sergey_
2005-11-07 12:47
2005.11.27
Delphi: Лицезия кончилась!