PRINTER_INFO_2 구조체 데이타를 아래와 같은 코드로 저장하여습니다.
<!--CodeS-->
procedure TPrinterUtilClass.SavePrinterInfo(PrinterName: string; DestStream: TStream);
var
PrnHandle : THandle;
PrnDefaults : PRINTER_DEFAULTS;
Buf, Temp : ^PRINTER_INFO_2;
cbBuf, pcbNeeded : DWORD;
begin
PrnDefaults.pDatatype := nil;
PrnDefaults.pDevMode := nil;
PrnDefaults.DesiredAccess := PRINTER_ACCESS_USE;
if OpenPrinter( PChar(PrinterName), PrnHandle, @PrnDefaults ) then
begin
GetPrinter( PrnHandle, 2, nil, 0, @pcbNeeded );
if pcbNeeded >0 then
begin
cbBuf := pcbNeeded;
try
GetMem( Buf, pcbNeeded );
GetPrinter( PrnHandle, 2, Buf, cbBuf, @pcbNeeded );
DestStream.Write( PChar(Buf), pcbNeeded );
finally
FreeMem( Buf );
end;
end else
ShowMessage('System Error Message: '+ SysErrorMessage(GetLastError));
ClosePrinter( PrnHandle );
end else
ShowMessage('System Error Message: '+ SysErrorMessage(GetLastError));
end;
<!--CodeE-->
저장된 데이타를 읽어오는 함수를 아래와 같이 하면 메모리 주소 참조 에러가 발생합니다.
<!--CodeS-->
function TPrinterUtilClass.AddPrinterTest( PrinterName: string; PrnInfoFileName: string; const ValueListEditor : TValueListEditor ) : Boolean;
var
F : file;
FSize : Cardinal;
InfoSize : Cardinal;
Buf : ^PRINTER_INFO_2;
FStream : TFileStream;
ReturnValue : Boolean;
begin
FStream := TFileStream.Create(PrnInfoFileName, fmOpenRead);
FSize := FStream.Size;
try
GetMem( Buf, FSize );
FStream.Read( PChar(Buf), FSize );
~~ Buf^을 참조하여 처리하는 부분에서 에러 발생
Buf^.pPrinterName
Buf^.pShareName
finally
FStream.Free;
FreeMem( Buf );
end;
result := ReturnValue;
end;
<!--CodeE-->
PRINTER_INFO_2 구조체가 비정형 사이즈라 그런지 조작하기 힘든네요..
PRINTER_INFO_2 구조체 뿐만 아니라... 구조체가 포인터 변수를 속성으로 가지는 경우는 어떻게 파일에
저장&로딩하여 사용하는지 궁금합니다.
구조체 속정하나하나를 각각 접근하여 저장&로딩하는 함수를 만들어야 하는건지...
저장할때
DestStream.Write( Buf^, pcbNeeded );
읽어올때
FStream.Read( Buf^, FSize );