2013-07-01 2 views
1

안녕하세요 내가이 포장 된 기록했습니다 :델파이 복사 MemoryStream을

Procedure AddToRec(ATargetUser:String); 
var 
MyRecord: PMyRecord; 
Strm:TMemoryStream; 
Size: Integer; 
begin 
Strm:=TMemoryStream.Create; 
try 
Strm.LoadFromFile('myFile.dat'); 
Strm.position:=0; 
Size:=Strm.size; 
GetMem(MyRecord,Size); 
ZeroMemory(MyRecord,Size); 
MyRecord.BufSize := Size; 
StrCopy(MyRecord.TargetUser,PChar(ATargetUser)); 

// here how could i copy the Strm into the StreamHolder ? 

//SendMyBuffer(MyRecord,Size); 

finally 
Strm.free; 
end; 
end; 
:

type 
TMyRecord = packed record 
    BufSize: Word; 
    TargetUser:array[0..80] of char; 
    StreamHolder: Byte; 
    end; 
    PMyRecord = ^TMyRecord; 

가 // 난 내 아래 절차를 참조하십시오 StreamHolder 에 MemoryStream을 저장하고 싶습니다를

그래서 Strm을 StreamHolder에 복사 할 수 있습니까?

많은 감사는

+0

@ 데이비드 헤퍼 : StreamHolder : 바이트; TMyRecord에 선언 된 – Sdean

+0

@ David Heffernan : 스트림을 MyRecord로 복사하지만 StrCopy (MyRecord.TargetUser, PChar (ATargetUser))를 유지하려고합니다. – Sdean

답변

3

당신은 @MyRecord.StreamHolder에 전체 스트림을 복사 할 것으로 보인다. 이런 그렇게 : 당신은 또한 당신의 GetMem 충분한 메모리를 할당 변경해야합니다

Strm.ReadBuffer(MyRecord.StreamHolder, Size); 

.

GetMem(MyRecord, Size + SizeOf(MyRecord^) - SizeOf(MyRecord.StreamHolder)); 

아니면 더 우아 :

GetMem(MyRecord, Size + Integer(@PMyRecord(nil)^.StreamHolder)); 

StreamHolder 전에 나타나는 기록의 그 부분을 고려하지 않는 코드를 의미로

.

+0

많은 고마워요 데이비드 Heffernan 그리고 만약 내가 스트림에 MyRecord.StreamHolder 다시 읽으려면 === 그냥 할 Strm.WriteBuffer (?, MyRecord.BufSize); – Sdean

+0

예, 기본 계획입니다. –

+0

다시 읽으려면 메모리를 어떻게 할당해야합니까? 그냥 다시 읽어 보시기 바랍니다 * 그냥 MemoryStream * 많은 감사 – Sdean

0

StreamHolder: tMemoryStream; 

StreamHolder: Byte; 

을 잡고

하는 절차를 변경하지 왜
var 
    MyRecord: PMyRecord; 
begin 
    GetMem(MyRecord,SizeOf(pMyRecord)); 
    myRecord.StreamHolder := TMemoryStream.Create; 
    try 
    myRecord.StreamHolder.LoadFromFile('myFile.dat'); 
    //Strm.position:=0; 
    //Size:=Strm.size; 
    //ZeroMemory(MyRecord,Size); 
    //MyRecord.BufSize := Size; 
    StrCopy(MyRecord.TargetUser,PChar(ATargetUser)); 
    finally 
    // no free in here... free the streamholder whenever you get rid of MyRecord... 
    end ; 
+1

BufSize를 할당하고 GetMem을 호출하여 레코드 포인터 크기가 아닌 레코드 크기를 전달해야합니다. –