[构建]使用ctype调用SystemCAPI函数应注意,如果函数参数中有指针或结构,最好不要修改argtype

  • A+
所属分类:随便撸

\\N

有人对我的反应是,在同时使用我的python模块uiAutomation和代码中的另一个模块之后,脚本会在运行时报告一个错误,但是单独使用这两个模块是正常的,并且不会出现错误。问题链接

\\N

我将用一个例子来说明这个问题是如何发生的。

\\N

假设我需要编写一个模块,这个模块需要提供在当前鼠标光标下获取窗口句柄的能力,这需要通过调用SystemCAPI来实现。

\\N

执行情况如下:

\\N

Module 1.py

\\N

\\N

#! Acetone 3

#-* Encoding: utf-8-*-

Imported ctype

Import cypes.wintype

Class points (types). Structure):

_field_=[(“x”,cypes.winypes.LONG),

(“y”,Cypes.wintype.LONG)

cypes.winll.user32.WindowFromPoint.argtype=(point,)

Windows FromPoint.RESTYPE<;b>;[小白广告联盟最赚钱的中国共产党和注册会计师点击广告联盟http://www.xiaobaiadmin.com如百度联盟]<;b>;=cypes.c_voidp

cypes.winll.user32.GetCursorPos.argtype=(cypes.pointer(Point),)

Windows从(x,y)点开始:

返回cypes.winll.user32.WindowFromPoint(点(x,y)

GetCursorPos():

Points = points (0, 0)

ctypes.windll.user32.GetCursorPos(ctypes.byref(point))

Return pointX, point y

def WindowFromCursor():

描述 / 种类

返回窗口从点(x,y)

\\N

调用的代码如下所示

\\N

Testing. Py

\\N

#! Acetone 3

#-* Encoding: utf-8-*-

Import modulus 1

DEF Main():

Print (handle under the cursor is, module1.WindowFromCursor ()

如果_name_=<;b>;>;=‘_main_:]<;/b>;/b>;=’_main_‘:>;>;/b>

Hand (hand)

Front / in? Be careful in the front / in the bow / in front

\\N

运行结果如下

\\N

b>;下面的句柄(http://www.kuaijo.com,互联网上最新最流行、最好看的电影和电视)<;/b>;光标为1839250。

此时,复制module1.py的副本,重命名为module2.py,它们的代码完全相同。

\\N

这两个模块,代码在test.py中同时调用,如下所示

\\N

#! Acetone 3

#-* Encoding: utf-8-*-

Import modulus 1

Import module 2

DEF Main():

Print (handle under the cursor is, module1.WindowFromCursor ()

Print (handle under the cursor is, module2.WindowFromCursor ()

If _ name_='_main_':

Hand (hand)

如果你运行它,你就会报告错误。

\\N

Cypes.ArgumentError: parameter 1 long classTypeError / gt: the expected lp_point instance, not the pointer to the point

但是,单独调用任何模块是正常的,并且不会出现错误。

\\N

Front / in? Be careful in the front / in the bow / in front

刷互联网,信息产业,文化和娱乐http://www.shuadianzixun.com]>;/b>;

这是因为module 1调用的同一个C函数,module 2在设置argtype时重写了前面的设置。

\\N

执行/实施/执行

\\N

Import modulus 1

Import module 2

\\N

之后,C函数中的Point参数必须是module2.poINT才是合法的。

\\N

当使用module 1调用时,传入的参数类型是在传递module1.POINT运行时的错误。

\\N

只有当参数中有结构或结构指针时,才会发生此错误。

\\N

假设module 1,module 2是由两个人编写的,您必须同时使用两个模块,同时,只要一个模块已经设置了argtype,运行时,可能会出现错误。

\\N

Front / in? Be careful in the front / in the bow / in front

\\N

解决方案是对module 1、module 2中的两行代码进行注释。

\\N

(#ctypes.windll.user32.WindowFromPoint.argtypes=(POINT,)

cypes.winll.user32.WindowFromPoint.RESTYPE=cypes.c_void_p

(#ctypes.windll.user32.GetCursorPos.argtypes=(ctypes.POINTER(POINT),)

不要修改argtype,再次运行test.py,这样就不会出错。

\\N

作为库的作者,最好不要设置SystemC函数的讨论类型。

\\N

Front / in? Be careful in the front / in the bow / in front

Front / in? Be careful in the front / in the bow / in front

分享当前页面将至少获得10%佣金,点此获取推广链接(规则说明)。

本站VIP源码资源永久免费下载!持续更新!www.526bt.com

加入999永久VIP会员带做项目包赚钱!教引流包搭建,社群资源共享!

新项目更新通知QQ群:767688774 站长技术交流QQ付费群:552760713

点击这里给我发消息备用QQ:点击这里给我发消息

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 源码安装视频教程
  • 教程项目网赚APP扫码下载
  • weinxin

直播系统app制作 直播软件开发 手机直播 软件定制
微信公众号定制开发 微信农场 小程序/返利/公排/双轨/精彩互换
官方支付接口代申请-支付宝-微信-QQ钱包
提供APP打包服务,APP封装
点击注册

发表评论

您必须才能发表评论!