FreePascal Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
FreePacal 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

FreePascal Q&A
[17] Re:C/C++ 소스를 델파이(라자루스) 포팅시 C 포인터 처리???
MarunGuy [marunguy] 2828 읽음    2012-01-19 15:53
에고, 파스칼을 배운지 얼마 안되다 보니 단순한 실수를 했네요. 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;   

+ -

관련 글 리스트
16 C/C++ 소스를 델파이(라자루스) 포팅시 C 포인터 처리??? MarunGuy 2945 2012/01/19
17     Re:C/C++ 소스를 델파이(라자루스) 포팅시 C 포인터 처리??? MarunGuy 2828 2012/01/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.