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