Q&A

  • [질문] PRINTER_INFO_2정보가 저장된 파일에서 읽어오기...
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 구조체 뿐만 아니라... 구조체가 포인터 변수를 속성으로 가지는 경우는 어떻게 파일에
저장&로딩하여 사용하는지 궁금합니다.

구조체 속정하나하나를 각각 접근하여 저장&로딩하는 함수를 만들어야 하는건지...
1  COMMENTS
  • Profile
    최용일 2009.11.06 23:36
    아래와 같이 해보세요.
    저장할때
    DestStream.Write( Buf^, pcbNeeded );
    읽어올때
    FStream.Read( Buf^, FSize );