와 함께 저는 현재 ctypes
모듈에 점점 그리고 난 이미 FindWindow
를 사용하여받은 HWND
핸들로 USER32 기능 GetWindowText
를 호출하는 것을 시도하고있다. 이번에는 더 많은 단계를 처리하고 ctypes.windll.user32.GetWindowText
함수를 호출하는 대신 함수 프로토 타입을 사용하려고합니다. 비록 내가 출력 매개 변수로 lpString
의 논쟁을 선언하는 데 문제가있어. 내 첫 번째 시도는이 방법으로 보았다 파이썬하는 ctypes : 프로토 타입 LPCSTR [OUT] 매개 변수
GetWindowText = cfunc("GetWindowTextA",windll.user32,c_int,
("hWnd",HWND,1),
("lpString",LPCSTR,2),
("nMaxCount",c_int,1)
)
을
이 프로토 타입은 즉시 호출 될 때 다음과 같은 예외를 산출한다 (cfunc
내가 here을 발견 조금 래퍼) :
chars,name = user32.GetWindowText(handle,255)
TypeError: c_char_p 'out' parameter must be passed as default value
모든 출력 변수는 POINTER(...)
유형이어야하므로 내 정의를 다음과 같이 변경했습니다.
GetWindowText = cfunc("GetWindowTextA",windll.user32,c_int,
("hWnd",HWND,1),
("lpString",POINTER(c_char),2),
("nMaxCount",c_int,1)
)
는하지만이 역시 예외가 산출 :
chars,name = user32.GetWindowText(handle,255)
ctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: wrong type
나는 누군가가 제대로 ctypes
프로토 타입을 사용하여 GetWindowText
함수를 호출하는 방법을 알고 있기를 바랍니다.
편집 : 나는 그것이 적어도 어떻게 든 일을 얻을 수있는 추가 연구를 통해
. 내가 고친 첫 번째 문제는 잘못된 호출 지정자가있는 cfunc()
의 사용법이었습니다. 그 함수의 정확한 복사본을 정의하고 winfunc()
으로 명명하고 return CFUNCTYPE(result, *atypes)((name, dll), tuple(aflags))
을 return WINFUNCTYPE(result, *atypes)((name, dll), tuple(aflags))
으로 대체했습니다.
그런 다음 프로토 타입을 추가로 검사했습니다. ("someParameter",POINTER(aType),2)
을 WINFUNCTYPE
에 다소 전달하면 호출시 aType
개체가 생성되고 해당 개체에 대한 포인터가 함수에 전달됩니다. 반환 된 튜플에서 aType
개체에 액세스 할 수 있습니다. 이것은 또 다른 문제를 야기한다. cstring은 문자 배열입니다. 그래서 ctypes에 c_char array
을 생성하라고 지시해야합니다. 즉, 다음과 같은 의미입니다.
GetWindowText = winfunc("GetWindowTextA",windll.user32,c_int,
("hWnd",HWND,1),
("lpString",POINTER(c_char*255),2),
("nMaxCount",c_int,1)
)
잘 작동합니다. 그러나 불행하게도, ctypes는 항상 nMaxCount
으로 지정된 크기를 무시하고 255 문자 길이의 cstring에 대한 포인터를 전달합니다.
제 의견으로는 출력 매개 변수로 정의 된 동적 크기가있는 cstring을 사용하여 작업 할 수있는 방법이 없다고 생각합니다. 유일한 가능성은 단순히 출력 매개 변수 기능을 사용하지 않고 입력 매개 변수로 LPCSTR
을 정의하는 것입니다. 피 호출자는 ctypes.create_string_buffer()
을 사용하여 버퍼를 만들어 함수에 전달해야합니다 (C 에서처럼).
예 이미 pywin32를 보았습니다.하지만 win32 이외의 곳에서 ctypes를 사용해야하고 persistent 코드를 원하기 때문에 사용하고 싶지 않습니다. (아마도 핸들 등을 교환해야 할 필요가 있습니다). 한편 프로토 타입 패턴 (하나는 일반적인 반환 값이 아니라 일반 반환 값이 아니라 일반 함수로 액세스 할 수 있음)과 Im은 래퍼 솔루션을 접근하거나 단순히 completly로 이동하는 것을 고려 중입니다. "출력 매개 변수"기능을 사용하지 않아도됩니다. – Paranaix
"영구 코드"가 무슨 뜻인지 모르겠지만, pywin32'PyHANDLE' 객체는 핸들을 교환해야 할 경우 원시 윈도우 핸들에서 탈착 할 수 있습니다. http://docs.activestate.com/activepython/2.4/pywin32/PyHANDLE.html 문서를 참조하십시오. 또한 파이썬'c_char_p' 타입은 입력 문자열만을 전달하는 것을 의미합니다. 예를 들어'create_string_buffer (255)'만을 사용하여 출력에 사용할 수있는 버퍼를 만드십시오. –