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

FreePascal Q&A
[155] Re:레코드 타입 변수 캐스팅?
MarunGuy [marunguy] 4127 읽음    2014-04-02 17:36
자답입니다.
변수주소를 포인터캐스팅하여 다시 역참조하니 에러없니 컴파일되네요.
Process32FirstW(hdl, PPROCESSENTRY32W(@proc_entry2)^ )


MarunGuy 님이 쓰신 글 :
: 안녕하세요.
:
:
function Process32FirstW(hSnapshot: HANDLE; var lppe: PROCESSENTRY32W): BOOL; stdcall;
 
: 두번째 인자가 PROCESSENTRY32W 레코드타입에 대한 레퍼런스 타입입니다.
: 제가 선언한 레코드 타입 TESTRECORDW8 을 전달하려고 하는데 어떻게 해야하나요?
:
: var
:   proc_entry2: TESTRECORDW8; 
: ...
: Process32FirstW(hdl, proc_entry2?????)
 
:
Process32FirstW(hdl, PROCESSENTRY32W(proc_entry2))
 
: 이렇게 하니 아래와 같은 컴파일에러가 납니다.
:
unitmain.pas(387,53) Error: Illegal type conversion: "TESTRECORDW8" to "tagPROCESSENTRY32W"

: jwawindows 패키지의 레코드 타입들이 64bit 빌드시 패딩이슈가 있어서 잘못된 크기를 가지고 있습니다.
: lazarus 1.2.0, codetyphon 4.8.0 모두 동일 증상입니다.
: 멤버가 똑같은 레코드타입을 다른 이름으로 선언하니 올바른 크기를 가지고 있습니다.
: 그래서, 테스트하기 위하여 새로 만든 레코드타입 변수를 인자로 전달하고 싶은데 어떻게 해야하나요?
:
type
:   PPROCESSENTRY32W = ^PROCESSENTRY32W;
:   {$EXTERNALSYM PPROCESSENTRY32W}
:   tagPROCESSENTRY32W = record
:     dwSize: DWORD;
:     cntUsage: DWORD;
:     th32ProcessID: DWORD;          // this process
:     th32DefaultHeapID: ULONG_PTR;
:     th32ModuleID:DWORD;            // associated exe
:     cntThreads: DWORD;
:     th32ParentProcessID: DWORD;    // this process's parent process
:     pcPriClassBase: LONG;          // Base priority of process's threads
:     dwFlags: DWORD;
:     szExeFile: array [0..MAX_PATH - 1] of WCHAR;   // Path
:   end;

:
: type
:   TESTRECORDW8 = record
:     dwSize: DWORD;
:     cntUsage: DWORD;
:     th32ProcessID: DWORD;          // this process
:     th32DefaultHeapID: ULONG_PTR;
:     th32ModuleID:DWORD;            // associated exe
:     cntThreads: DWORD;
:     th32ParentProcessID: DWORD;    // this process's parent process
:     pcPriClassBase: LONG;          // Base priority of process's threads
:     dwFlags: DWORD;
:     szExeFile: array [0..MAX_PATH - 1] of WCHAR;   // Path
:   end; 

+ -

관련 글 리스트
154 레코드 타입 변수 캐스팅? MarunGuy 4155 2014/04/02
155     Re:레코드 타입 변수 캐스팅? MarunGuy 4127 2014/04/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.