2017-12-26 11 views
0

Go 프로젝트에서 독점 DLL을 사용하려고합니다.Windows에서 DLL 사용

DLL의 방법 설명의

하나는 다음과 같습니다

내가 좋아하는 일을하고있어 내 테스트 이동 프로젝트
BYTE* Init(const BYTE* path, int id); 

: 호출되는

import (
    "golang.org/x/sys/windows" 
) 

var (
    lib = windows.MustLoadDLL("dllname.dll") 
    init = lib.MustFindProc("Init") 
) 

func main() { 
    path := "some" 
    bytePath = []byte(path) 

    init.Call(
    uintptr(unsafe.Pointer(&bytePath)), 
    uintptr(9) 
) 
} 

도서관, 오류 메시지 "경로가있다 존재하지 않는다 "고 생각합니다.하지만 제 경로의 유형이 옳지 않다고 생각합니다. 그래서 도서관에서 폴더를 볼 수 없습니다.

아마도이 작업을 수행하는 더 좋은 방법이 있을까요? 어쩌면 Go 사용법의 나쁜 경우이고 일부 패키지 또는 언어를 찾아야합니까?

+1

그 문법적으로 잘못된 때문에 내가보기 엔, 오류가 "경로가 존재하지 않습니다"라고 의심한다. _exact_ 오류를 붙여 넣을 수 있습니까? – Flimzy

+1

[tag : C#]가이 질문과 관련되어있는 이유는 확실하지 않으므로 삭제하겠습니다. 문제와 관련된 태그 만 추가하십시오. –

+0

@Flimzy 예, 그건 단지 예일뿐입니다. dll의 이름도 'dllname.dll'이 아닙니다.) – MrTwister

답변

5

경로 가능성이 NUL 종료 할 필요가 :

import (
    "golang.org/x/sys/windows" 
) 

var (
    lib = windows.MustLoadDLL("dllname.dll") 
    init = lib.MustFindProc("Init") 
) 

func main() { 
    path := "some" 
    bytePath = []byte(path + "\x00") 

    init.Call(
    uintptr(unsafe.Pointer(&bytePath[0])), 
    uintptr(9) 
) 
} 
+0

왜 & bytePath [0]을 사용합니까? NULL로 끝나는 경로를 만들려고했지만 [0]에 대해 알지 못합니다. 내 말은, 작동한다는거야! 고맙습니다! 하지만 [0]은 무엇이며 어디에서 읽을 수 있습니까? – MrTwister

+1

@MrTwister Go 문자열과 Windows가 원하는 것의 차이 때문입니다. Go 문자열은 (다소) 길이 + 바이트 배열에 대한 포인터입니다. Windows (즉, C 문자열)는 NULL로 끝나는 바이트 배열 (0 코드의 문자)을 원합니다. 'bytePath [0]'는 바이트 배열의 첫번째 문자입니다. –

+0

@ArmanOrdookhani 예, NULL 문자에 대해 알고 있고 [0]이 첫 번째 요소입니다. :) 나를 놀라게하는 이유는 바로 & bytePath 대신 포인터의 첫 번째 요소를 사용해야한다는 것입니다. – MrTwister