проблема с вызовом WinAPI функции

estra

Новичок
Пользователь
Янв 19, 2022
4
0
1
Добрый день!

Пожалуйста, помогите и объясните что не так. Нужно вызвать API функцию, вот так получается:

Python:
import ctypes as ct
from ctypes import wintypes as wt

prototype = ct.WINFUNCTYPE(ct.c_bool, ct.POINTER(wt.POINT))
GetCursorPos = prototype(("GetCursorPos", ct.windll.user32))
point = wt.POINT()
result = GetCursorPos(ct.byref(point))
if result:
    print(point.x, point.y)

А вот если я пытаюсь описать параметры, ничего не получается:

Python:
import ctypes as ct
from ctypes import wintypes as wt

prototype = ct.WINFUNCTYPE(ct.c_bool, ct.POINTER(wt.POINT))
paramflags = (2, "lppoint"),
GetCursorPos = prototype(("GetCursorPos", ct.windll.user32), paramflags)
point = wt.POINT()
result = GetCursorPos(lppoint=ct.POINTER(point)) # must be a ctypes type
if result:
    print(point.x, point.y)

Что я делаю не так, и как это поправить?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 677
479
83
опишите задачу, что вы хотите сделать?
 

estra

Новичок
Пользователь
Янв 19, 2022
4
0
1
Хочу разобраться, как правильно создавать прототипы функций.
Без описания параметров получилось, а с описанием не получается.
Хочу понять, что я делаю не так и как надо делать правильно.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 677
479
83
paramflags = (2, "lppoint"), - входной параметр должен быть 1
ct.POINTER(point) - это делает просто указатель указанного типа, который никуда не указывает
ct.pointer(point) - создает указатель, который указывает на переданный объект

Python:
import ctypes as ct
from ctypes import wintypes as wt

prototype = ct.WINFUNCTYPE(ct.c_bool, ct.POINTER(wt.POINT))
paramflags = (1, "lppoint"),
GetCursorPos = prototype(("GetCursorPos", ct.windll.user32), paramflags)
point = wt.POINT()
result = GetCursorPos(lppoint=ct.pointer(point)) # must be a ctypes type
if result:
    print(point.x, point.y)

надеюсь понятно

upd
так тоже работает
Python:
import ctypes as ct
from ctypes import wintypes as wt

prototype = ct.WINFUNCTYPE(ct.c_bool, ct.POINTER(wt.POINT))
paramflags = (1, "lppoint"),
GetCursorPos = prototype(("GetCursorPos", ct.windll.user32), paramflags)
point = wt.POINT()
result = GetCursorPos(lppoint=point) # must be a ctypes type
if result:
    print(point.x, point.y)
 
Последнее редактирование:
  • Мне нравится
Реакции: estra

estra

Новичок
Пользователь
Янв 19, 2022
4
0
1
Спасибо! Но если честно не все понятно. Спецификация GetCursorPos выглядит так

C:
BOOL GetCursorPos(  [out] LPPOINT lpPoint );

Параметр lpPoint выходной, почему тогда в описание параметра нужно писать 1 (входной). Из-за того что параметр является указателем (передается по ссылке)?

И еще, можешь подсказать, чем ct.pointer отличается от ct.byref ?
 
Последнее редактирование:

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 677
479
83
Параметр lpPoint выходной, почему тогда в описание параметра нужно писать 1 (входной).
да действительно...
если честно, то не знаю...


И еще, можешь подсказать, чем ct.pointer отличается от ct.byref ?
это можно в документации посмотреть - https://docs.python.org/3.10/library/ctypes.html#ctypes.byref
если вкратце, то:
ct.byref можно использовать только как параметр функции, и он быстрее, чем ct.pointer
 
Последнее редактирование:
  • Мне нравится
Реакции: estra

Форум IT Специалистов