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)

 

댓글수0