Go 언어에서 DLL 함수 호출(시스템 호출)

7174 단어 GoWindows
★★★★ 2021/11/23 추기 ★★★★mksyscall_windows.go의 도구인데 잘 몰라요.
(지금도 잘 이해가 안 돼) 이 도구 자체의 이름으로 볼 때 윈도우를 만드는 시스템 호출물이다.
제목이 변경되었습니다. DLL 함수를 호출하는 방법으로는 적합하지 않기 때문입니다.
참고할 수 있도록 허락해 주십시오: Big Sky:golang에서 모델 DLL을 호출하는 방법
―――――――――――
우선, 나는 syscall_windows.go라는 파일을 만들어서 다음과 같은 내용을 정의했다.
  • go generate에 사용되는 도구mksyscall_windows.go 중간 코드 생성zsyscall_windows.go에 대한 정의
  • mksyscall_windows.go DLL 함수를 포함하는 Go 언어 함수
  • 정의
    syscall_windows.go
    package main
    
    //go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall_windows.go
    
    //sys messageBox(hWnd syscall.Handle, lpText string, lpCaption string, uType uint32) (dwRet uint32, err error) = User32.MessageBoxW
    
    go generate 는 다음 코드를 생성합니다.
    zsyscall_windows.go(발췌)
    func messageBox(hWnd syscall.Handle, lpText string, lpCaption string, uType uint32) (dwRet uint32, err error) {
        var _p0 *uint16
        _p0, err = syscall.UTF16PtrFromString(lpText)
        if err != nil {
            return
        }
        var _p1 *uint16
        _p1, err = syscall.UTF16PtrFromString(lpCaption)
        if err != nil {
            return
        }
        return _messageBox(hWnd, _p0, _p1, uType)
    }
    
    func _messageBox(hWnd syscall.Handle, lpText *uint16, lpCaption *uint16, uType uint32) (dwRet uint32, err error) {
        r0, _, e1 := syscall.Syscall6(procMessageBoxW.Addr(), 4, uintptr(hWnd), uintptr(unsafe.Pointer(lpText)), uintptr(unsafe.Pointer(lpCaption)), uintptr(uType), 0, 0)
        dwRet = uint32(r0)
        if dwRet == 0 {
            if e1 != 0 {
                err = errnoErr(e1)
            } else {
                err = syscall.EINVAL
            }
        }
        return
    }
    
    ★의문★----dwRet(이상 시 0) 오류 처리가 잘 된 것 같습니다.
    정상시0의 함수는 어떻게 합니까?
    ★★★★ 2021/11/23 추기 ★★★★
    Windows 시스템 호출을 처리하는 함수이기 때문에 DWROD가 반환될 때 예외일 경우 0이 될 수 있습니다.
    ―――――――――――
    그리고 생성된 messageBox() 을 호출하면 됩니다.
    main.go
    package main
    
    func main() {
        messageBox(0, "message", "title", 0)
    }
    
    실행할 때 메시지 상자를 표시합니다.

    좋은 웹페이지 즐겨찾기