![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Копирование данных из TStream в буффер.
Ega23 © (2005-01-27 13:30:00)Пишу dll. Поскольку, возможно, она будет использоваться не только из-под Делфи - не могу оперировать VCL-классами в экспортных функциях. А задача - передача "наверх" данных о сотруднике, в частности - его фотография.
Делаю так:
type
PPersInfo=^TPersInfo;
TPersInfo=packed record
.... //Тут не важно...
PersImgLength : Cardinal;
PersImgBuff : Pointer;
end;
procedure TKedrDBPersInfo.GetPersInfoTest(var PersInfo: PPersInfo);
var
jpg:TJpegImage;
fn:String;
ms:TMemoryStream;
begin
try
fn:=ExtractFilePath(Paramstr(0))+'FaceImg.jpg';
jpg:=TJpegImage.Create;
ms:=TMemoryStream.Create;
try
jpg.LoadFromFile(fn);
jpg.SaveToStream(ms);
PersInfo^.PersImgLength:=ms.Size;
GetMem(PersInfo^.PersImgBuff, PersInfo^.PersImgLength);
ms.Position:=0;
ms.ReadBuffer(PersInfo^.PersImgBuff, PersInfo^.PersImgLength);
finally
ms.Free;
jpg.Free;
end;
AV вылетает на ms.Free;
Причём, после ms.ReadBuffer - в отладчике навожу на ms.Size - вижу AccessViolation...
Чего не так делаю?
Erik1 (2005-01-27 15:31:00) [1]Хотя бы fn:=ExtractFilePath(Paramstr(0))+'FaceImg.jpg'; вынеси за Try. А ShareMem кажется тут непонадобится.
icWasya (2005-01-27 14:52:00) [2]и помнить о Sharemem!!!
Ega23 (2005-01-27 13:42:00) [3]Тьфу-ты. Блин. Спасибо!
MBo (2005-01-27 13:41:00) [4]ms.ReadBuffer(PersInfo^.PersImgBuff ^