안녕하세요.
델파이(라자루스)를 배워볼려고 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;