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

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

TMemoryStream


Страницы:   1 2

авыф ©   (2007-12-18 18:51:00) 

вызываю процедуру, делаю там что-то, возвращаю результат:
var
 frStream, fs : TMemoryStream;
 buf: string;
 outBuff: PChar;
 outLen: DWORD;
Begin
 outLen := 123;
 GetMem(outBuff, 5000000);
 frStream := TMemoryStream.Create;
 frStream.LoadFromFile(frOld);
 frStream.Seek(0, soFromBeginning);
 BuildFRT(Application.Handle, frStream.Memory, frStream.Size, outBuff, 5000000, @outLen);

 fs := TMemoryStream.Create;
 fs.SetSize(outLen);
//  fs.Read(outBuff, outLen);
 fs.ReadBuffer(outBuff, outLen);
 fs.SaveToFile('c:\t4.fr3');

 rep.LoadFromStream(fs);
 frStream.Free;
 FreeMEm(outBuff);

 rep.ShowReport();

вываливает AV на чтение в стрим. Что не так я делаю?


авыф   (2007-12-19 11:24:00) [1]

сорри, попутал
всем спасибо


Плохиш   (2007-12-19 11:14:00) [2]


> авыф   (19.12.07 10:58) [22]

Запись в поток fs.


авыф   (2007-12-19 10:58:00) [3]


> а почитал бы любую книженцию по паскалю уже знал бы давно

я думал, что раз он указатель, то этого достаточно, а вообще про передачу по ссылке я знал.

outBuff у меня PChar

запись чего? файла? просто не написал fs.SaveToFile('c:\t4.fr3');


Palladin   (2007-12-19 10:50:00) [4]


> спасибо, буду знать.

а почитал бы любую книженцию по паскалю уже знал бы давно


> здесь-то что не так?

1 ну а outBuff у тебя какого типа?
2 где тут запись? тут чтение только


авыф   (2007-12-19 10:49:00) [5]


> Сергей М. ©   (19.12.07 10:45) [18]

да это все в длл-ке, эт, так, для примера, на sharemem мораторий


авыф   (2007-12-19 10:48:00) [6]


> Palladin ©   (19.12.07 10:41) [17]

спасибо, буду знать.

и еще, тады:
fs.ReadBuffer(outBuff, outLen) - не хочет, зараза, ничего записывать!
смотрю в файле, а там:
...
р­є
р­є
р­є
...
здесь-то что не так?


Сергей М.   (2007-12-19 10:45:00) [7]


> авыф   (19.12.07 10:26) [14]


Возврат именно pchar-типа данных чем обоснован ?

Обычная ф-ция, возвращающая string-тип чем-то не устраивает ?


Palladin   (2007-12-19 10:41:00) [8]

большая, мля! указатель это он для тебя указатель, а для компилятора обычная перменная, указывая Var в параметрах, ты говоришь компилятору, что бы он в стек заносил не сам значение переменной, а ссылку на нее, соответственно меняя значение параметра, ты меняешь лишь значение которое находится в стеке и никак не отражается на занчении самой переменной, а если ты переменную передал по ссылке (var), то меняя значение параметра ты меняешь значение и самой переданной переменной, а указатель она или нет - абсолютно монопенисуально


авыф   (2007-12-19 10:36:00) [9]

во, блин, а какая разница-то указателю var или не var?


Palladin   (2007-12-19 10:34:00) [10]

var в параметрах укажи


авыф   (2007-12-19 10:26:00) [11]

блин, засада.
как мне в вызываемой процедуре PChar'у присвоить значение типа string?
var_PChar := PChar(var_srt) - в процедуре видит нормально, а возвращать ничего не хочет


авыф   (2007-12-19 10:18:00) [12]


> Palladin ©   (19.12.07 10:13) [12]

да, точно
спс


Palladin   (2007-12-19 10:13:00) [13]

ну ты же видишь как я со стрингом работаю, указываю адрес (значек @) первогосимвола строки


авыф   (2007-12-19 10:11:00) [14]


> Palladin ©   (19.12.07 10:07) [10]

а как тогда со стрингом?


Palladin   (2007-12-19 10:07:00) [15]

компилятору трудно! откуда он может знать твои желания? ты ему тупо сказал записать все данные начиная с адреса переменной outBuf размером outLen, именно адреса самой переменной, а не адреса на который эта переменная указывает, ты тупо сказал - он тупо и сделал!


авыф   (2007-12-19 10:05:00) [16]


> Palladin ©   (19.12.07 09:53) [6]

вот именно это я и имел в виду в [3] - что компилятору "трудно догадаться", что это за тип?


авыф   (2007-12-19 10:03:00) [17]


> Palladin ©   (19.12.07 09:53) [6]

Не, в моем случае string не получится - эт я так, для отладки состряпал кусочек, а в реале вся эта байда в длл-ке (моя дельфа не хочет, сволочь, их отлаживать) и на ShareMem вето.


Palladin   (2007-12-19 09:58:00) [18]

странно, форум сглючил...


Palladin   (2007-12-19 09:53:00) [19]

String - это Compiler Magic
фактически указатель, но работать можно и как c обычной переменной, например в твоем случае можно и его использовать вместо PChar, выглядеть будет как:

var
frStream, fs : TMemoryStream;
buf: string;
outBuff: String;
outLen: DWORD;
Begin
outLen := 123;
SetLength(outBuff, 5000000);
frStream := TMemoryStream.Create;
frStream.LoadFromFile(frOld);
frStream.Seek(0, soFromBeginning);
BuildFRT(Application.Handle, frStream.Memory, frStream.Size, @outBuff[1], 5000000, @outLen);

fs := TMemoryStream.Create;
fs.SetSize(outLen);
fs.ReadBuffer( outBuff[1], outLen);
fs.SaveToFile('c:\t4.fr3');

rep.LoadFromStream(fs);
frStream.Free;
// FreeMEm(outBuff); - и это уже не нужно

rep.ShowReport();


авыф   (2007-12-19 09:45:00) [20]


> Palladin ©   (18.12.07 19:01) [4]

а string - не указатель?


Страницы:   1 2

Наверх

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