안녕하세요.
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; |