에고, 파스칼을 배운지 얼마 안되다 보니 단순한 실수를 했네요. TT_TT;;
if ... then, for ...do 문 뒤에 ";" 세미콜론을 넣어놓은게 문제였네요.
디버거로 트레이스하다가 발견했습니다.
다음은 정상동작하는 소스입니다. ^^;;..
procedure TFormMain.load_printer_name;
var buf_ptr:Winspool.PPRINTER_INFO_2W; info_count:DWORD; idx:LongInt;
begin
buf_ptr := printlib.prt_enum_printers(2, @info_count);
{if buf_ptr=Nil then
begin
OutputDebugString('load_printer_name : fail to prt_enum_printers');
exit
end;}
for idx:=0 to info_count-1 do
begin
OutputDebugString('buf_ptr[idx].pPrinterName');
Self.ComboBoxPrinter.AddItem(buf_ptr[idx].pPrinterName, Nil)
end;
FreeMem( buf_ptr )
end;
function prt_enum_printers(level:DWORD; returnd_ptr: PDWORD):pointer;
var buf_ptr:PBYTE; buf_cnt, needed:DWORD; enum_result:BOOL;
begin
Winspool.EnumPrintersW(Winspool.PRINTER_ENUM_LOCAL, Nil, level, Nil, 0, @needed, returnd_ptr);
GetMem(buf_ptr, needed );
{if buf_ptr=Nil then
begin
OutputDebugString('prt_enum_printers : fail to cmem.Malloc');
result:=Nil;
exit
end;}
buf_cnt:=needed;
enum_result := Winspool.EnumPrintersW(Winspool.PRINTER_ENUM_LOCAL, Nil, level,
buf_ptr, buf_cnt, @needed, returnd_ptr);
if enum_result=FALSE then
begin
OutputDebugString('prt_enum_printers : fail to EnumPrinters');
FreeMem(buf_ptr);
result:=Nil;
exit
end;
result:=buf_ptr
end;
그럼, 수고하세요.
MarunGuy 님이 쓰신 글 :
: 안녕하세요.
: 델파이(라자루스)를 배워볼려고 C/C++ 로 작성된 기존 소스를 라자루스로 작성해보고 있는 중입니다.
: 다른 건 그럭저럭 해보겠는데 C 포인터를 포팅하는 것은 너무 어렵네요. TT_TT;;;
:
: 아래 C/C++ 소스를 밑의 라자루스 소스를 포팅하기는 했는데,
: Self.ComboBoxPrinter.AddItem(buf_ptr[idx].pPrinterName, Nil) 이 줄에서 계속 충돌이 발생합니다.
:
: 무엇이 잘못된 걸까요?
: 파스칼은 초보라 좀 힘드네요..TT_TT;;
:
: C/C++ 버전 : wxWidget 2.8, win32
:
void FrameMain::load_printer_name(void)
: {
: PRINTER_INFO_2 *Info2;
: DWORD Count;
: DWORD i;
:
: if( !(Info2 = (PRINTER_INFO_2 *)prtEnumPrinters(2, &Count)) )
: {
: return;
: }
:
: for( i=0; iAppend(Info2[i].pPrinterName);
: }
:
: free(Info2);
:
: combo_box_printer->SetSelection(0);
: }
:
: void *prtEnumPrinters(DWORD Level, DWORD *pcReturned)
: {
: BYTE *Buf;
: DWORD cbBuf, cbNeeded;
:
: EnumPrinters( PRINTER_ENUM_LOCAL, NULL, Level, NULL, 0, &cbNeeded, pcReturned );
:
: if( !(Buf = (BYTE *)malloc(cbNeeded)) )
: {
: OutputDebugString(_T("prtEnumPrinters : malloc Fail"));
: return NULL;
: }
:
: cbBuf = cbNeeded;
:
: if( !EnumPrinters( PRINTER_ENUM_LOCAL, NULL, Level, Buf, cbBuf, &cbNeeded, pcReturned ) )
: {
: OutputDebugString(_T("prtEnumPrinters : EnumPrinters Fail"));
: free(Buf);
: return NULL;
: }
:
: return Buf;
: }
:
: 라자루스 버전 : 0.9.31, fcp 2.6.1, win32
:
function prt_enum_printers(level:DWORD; returnd_ptr: PDWORD):pointer;
: var buf_ptr:PBYTE; buf_cnt, needed:DWORD;
: begin
: Winspool.EnumPrintersW(Winspool.PRINTER_ENUM_LOCAL, Nil, level, Nil, 0, @needed, returnd_ptr);
: GetMem(buf_ptr, needed );
: {if buf_ptr=Nil then;
: begin
: OutputDebugString('prt_enum_printers : fail to cmem.Malloc');
: result:=Nil;
: exit
: end;}
:
: buf_cnt:=needed;
:
: Winspool.EnumPrintersW(Winspool.PRINTER_ENUM_LOCAL, Nil, level, buf_ptr, buf_cnt, @needed, returnd_ptr);
: {if buf_ptr=Nil then;
: begin
: OutputDebugString('prt_enum_printers : fail to EnumPrinters');
: FreeMem(buf_ptr);
: result:=Nil;
: exit
: end;}
:
: result:=buf_ptr
: end;
:
: procedure TFormMain.load_printer_name;
: var buf_ptr:Winspool.PPRINTER_INFO_2W; info_count:DWORD; idx:LongInt;
: begin
: buf_ptr := printlib.prt_enum_printers(2, @info_count);
: {if buf_ptr=Nil then;
: begin
: OutputDebugString('load_printer_name : fail to prt_enum_printers');
: exit
: end;}
:
: for idx:=1 to info_count do;
: begin
: OutputDebugString('buf_ptr[idx].pPrinterName');
: Self.ComboBoxPrinter.AddItem(buf_ptr[idx].pPrinterName, Nil)
: end;
:
: FreeMem( buf_ptr )
: end;