Go/window_api
[Go] WinAPI C 타입 ↔ Go 타입 대응표 (syscall + unsafe 기준)
_HelloWorld_
2025. 5. 11. 17:03
WinAPI 타입 (C/C++) 의미 Go 대응 타입 / 표현 방식 설명
BOOL | 정수형 bool (int) | int32 or bool | 0: false, 1: true |
BYTE | 1바이트 부호 없는 정수 | byte or uint8 | |
WORD | 2바이트 부호 없는 정수 | uint16 | |
DWORD, ULONG, UINT | 4바이트 부호 없는 정수 | uint32 | |
INT, LONG | 4바이트 부호 있는 정수 | int32 | |
LONGLONG | 8바이트 부호 있는 정수 | int64 | |
ULONGLONG, ULARGE_INTEGER | 8바이트 부호 없는 정수 | uint64 | |
HANDLE, HWND, HMODULE, HDC 등 | 포인터 기반 핸들 | uintptr | 핸들 = 정수형 주소로 처리 |
LPVOID, PVOID | 아무 타입의 포인터 | unsafe.Pointer or uintptr(unsafe.Pointer(...)) | |
LPCVOID, PCVOID | const void* (읽기 전용) | 동일하게 처리 | |
LPWSTR, LPCWSTR | wchar_t* (UTF-16 문자열) | syscall.StringToUTF16Ptr("문자열") | |
LPSTR, LPCSTR | char* (ANSI 문자열) | syscall.StringBytePtr("문자열") (UTF-8은 직접 변환 필요) | 거의 사용 X |
PULONG, PDWORD, PBOOL 등 | 기본 타입 포인터 | uintptr(unsafe.Pointer(&변수)) | |
PCHAR, PWSTR, PBYTE | 기본 포인터 | *byte, *uint16 등으로 선언 가능 | |
PULARGE_INTEGER | *uint64 | uintptr(unsafe.Pointer(&변수)) | GetDiskFreeSpaceExW 등에서 사용 |
예시 비교
BOOL GetDiskFreeSpaceExW(
[in, optional] LPCWSTR lpDirectoryName,
[out, optional] PULARGE_INTEGER lpFreeBytesAvailableToCaller,
[out, optional] PULARGE_INTEGER lpTotalNumberOfBytes,
[out, optional] PULARGE_INTEGER lpTotalNumberOfFreeBytes
);
path := syscall.StringToUTF16Ptr("C:\\")
var freeBytesAvailable, totalBytes, totalFreeBytes uint64
getDiskFreeSpaceExW.Call(
uintptr(unsafe.Pointer(path)), // LPCWSTR
uintptr(unsafe.Pointer(&freeBytesAvailable)), // PULARGE_INTEGER
uintptr(unsafe.Pointer(&totalBytes)), // PULARGE_INTEGER
uintptr(unsafe.Pointer(&totalFreeBytes)), // PULARGE_INTEGER
)
- 문자열: UTF-16 포인터 = syscall.StringToUTF16Ptr("경로")
- 구조체/정수 포인터: uintptr(unsafe.Pointer(&변수))
- 배열 주소 넘길 땐 반드시 [0]: &arr[0] 또는 unsafe.Pointer(&arr[0])
- 핸들은 그냥 정수처럼 취급 (uintptr)