python调用动态链接库windows_用win从python ctypes调用标准windows.dll的Segfault
我试图在Linux上运行的Python脚本中从Kernel32.dll调用一些函数。正如Johannes Weiß指出的How to call Wine dll from python on Linux?我正在加载内核32。动态链接库.so通过ctypes.cdll.LoadLibrary()而且装得很好。我可以看到kernel32已加载,甚至还有GetLastError()函数。不过,每当我试图调用函数时,都会得到segfault。在import ctypes
kernel32 = ctypes.cdll.LoadLibrary('/usr/lib/i386-linux-gnu/wine/kernel32.dll.so')
print kernel32
#
print kernel32.GetLastError
# <_funcptr object at>
gle = kernel32.GetLastError
# OK
gle_result = gle()
# fails with
# Segmentation fault (core dumped)
print gle_result
首先,我想称之为惯例差异,但似乎没什么大不了的。我以测试简单函数GetLastError函数结束,没有任何参数,但我仍然得到分段错误。在
我的测试系统是Ubuntu12.10、Python2.7.3和wine-1.4.1(一切都是32位)
升级版
我继续我的测试,找到了几个函数,我可以通过ctypes调用而不使用segfault。例如,我可以命名Beep()和GetCurrentThread()函数,许多其他函数仍然给我segfault。我创建了一个小的C应用程序来测试kernel32。动态链接库.so库中没有python,但我得到的结果基本上是相同的。在
^{pr2}$
我试图对Sleep()函数使用不同的调用约定,但也没有成功。当我比较Wine源代码中的函数声明\实现时,它们本质上是相同的
声明HANDLE WINAPI GetCurrentThread(void) // http://source.winehq.org/source/dlls/kernel32/thread.c#L573
BOOL WINAPI Beep( DWORD dwFreq, DWORD dwDur ) // http://source.winehq.org/source/dlls/kernel32/console.c#L354
HMODULE WINAPI DECLSPEC_HOTPATCH LoadLibraryExA(LPCSTR libname, HANDLE hfile, DWORD flags) // http://source.winehq.org/source/dlls/kernel32/module.c#L928
VOID WINAPI DECLSPEC_HOTPATCH Sleep( DWORD timeout ) // http://source.winehq.org/source/dlls/kernel32/sync.c#L95
WINAPI is defined to be __stdcall
不过,有些是有用的,有些是不行的。据我所知,这些源代码是针对kernel32.dll文件和kernel32的。动态链接库.so文件是一种代理,它应该提供对kernel32.dll for linux代码的访问。也许我需要找到kernel32的确切来源。动态链接库.so归档并查看声明。在
有没有什么工具可以让我看一下里面的.所以文件并找出使用了什么函数和什么调用约定?在
python调用动态链接库windows_用win从python ctypes调用标准windows.dll的Segfault相关推荐
- python通过ctypes调用海康网络sdk取流
项目中经常需要使用海康的网络摄像头,做视频图像算法经常会用到rtsp流,但是rtsp一般很难保证实时性且解码效率不能保证.通过海康给的python的demo,对模块进行封装以方便python像调用op ...
- JNative 调用动态链接库 调用动态链接库函数
假设我有一个叫test.dll的动态库,其中有一个函数如下: extern "C" int add(int* a,int* b,int* c,int d,char* Pic ...
- python调用ctypes中windll中的方法超时处理_python中使用ctypes调用MinGW生成的动态链接库(dll)...
关于gcc编译dll的我就不说了,网上举例一大堆,下面以g++为例. 假设有一个test.cpp文件如下: extern "C" { __declspec(dllexport) d ...
- python调用动态链接库传送protobuf数据。
什么是protobuf protobuf是Google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多.开发者定义类似于 ...
- Python 调用动态链接库
Python 调用动态链接库 ctypes是Python调用c的动态链接库的一个内置模块. 通过 CMake 构建动态链接库 项目结构 ├── CMakeLists.txt # CMake 构建配置文 ...
- python和c-python和C的如何实现互相调用?
本文和大家分享的是python和c的互相调用相关知识,一起来看看吧,希望对大家学习python有所帮助. 最近在考虑基于udp做一个用于网游战斗中的数据同步协议,为了前期测试数据,决定先做一个外部的代 ...
- python能调用身份证读卡器吗_用Python在Linux下调用新中新DKQ-A16D读卡器,读二代证数据...
1.背景 最近在研究二代证读卡器,手头上的设备是新中新DKQ-A16D,在官网(https://www.onecardok.com.cn/download)逛了一圈,发现Win下的示例,浏览器插件很多 ...
- python隐藏源码,生成pyd文件并调用的完整过程
目录 pyd 特点及生成方式 首先需要在 demo.py 同目录下新建个 setup.py 文件,具体代码如下 在生成之前或许我们需要先做一个事情,那就是安装vs_buildtools 在命令行 ...
- python使用ctypes调用c/c++函数
python调用c/c++函数 工具 一 生成动态链接库文件 1. 创建头文件 2. 项目属性选择配置类型为动态库 3. 选择Debug x86,启动调试 4. 无视以下报错信息 5. 找到生成的dl ...
最新文章
- Struts2学习第二天——动态方法调用
- openresty开发系列31--openresty执行流程
- 使用AutoIt实现UI自动化上传附件
- JavaWeb 安全问题及解决方案
- Maven 系列 3:如何在 Eclipse 中集成配置 Maven(以 apache-maven-3.6.2、eclipse-jee-2019-09-R-win32-x86_64 为例)
- 算法的时间复杂度(python版容易理解)+常用的时间复杂度、python代码--数据结构
- html5复习分类,HTML5考试复习资料.doc
- Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed betwee...
- Android Fragment + ViewPater + Fragment嵌套Fragment实战
- 数学之美 第二版 pdf
- App首次安装 - 授权网络访问的坑
- 山东大学_网络攻击与防范(林)_名词解释
- 权限系统设计学习总结(1)——多租户的RBAC权限管理
- JAVA创建内部类对象
- Google reCaptcha验证码无法显示解决方案
- 2016 server win 假死_Windows Server下Apache假死堵塞卡死无响应解决方法
- 技术小卡系列之Eclipse 窗口说明
- 易点云冲刺上市:亏损收窄、债务高企,租电脑的生意能否长久?
- 递归算法之蜜蜂路线问题
- Java Z 字形变换
热门文章
- php如何做熔断降级,spring cloud 如何实现服务熔断服务降级
- 树莓派python3.7_[Linux] 树莓派编译python3.7.4
- Echart常用效果(一)
- linux下lua bit模块的安装
- RabbitMQ使用详解
- linux上进程状态查询
- java多线程问题_【java 多线程】多线程并发同步问题及解决方法
- nginx 图片站点加访问权_nginx配置访问图片路径以及html静态页面的调取方
- windows进程管理器_软件进程自动重启一遍又一遍……你需要这款自动杀进程的小公举ProcessKO...
- mysql myisam转innodb_Mysql MyISAM数据库批量转换表引擎为Innodb