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

FreePascal Q&A
[16] C/C++ 소스를 델파이(라자루스) 포팅시 C 포인터 처리???
MarunGuy [marunguy] 2948 읽음    2012-01-19 15:24
안녕하세요.
델파이(라자루스)를 배워볼려고 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 2948 2012/01/19
17     Re:C/C++ 소스를 델파이(라자루스) 포팅시 C 포인터 처리??? MarunGuy 2833 2012/01/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.