免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: Heaice
打印 上一主题 下一主题

python调用DLL问题(急) [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-01-06 13:10 |只看该作者
是B的确没有改变va1,va2的值,还是不能用c++ 的dll?我用一个c的dll试了一下可以

import ctypes
tt=ctypes.CDLL('add.dll')
g1 = ctypes.c_int(10)
g2 =  ctypes.c_int(15)
print g1,g2
tt.lkadd(ctypes.byref(g1),ctypes.byref(g2))
print g1,g2

输出:
c_long(10) c_long(15)
c_long(500) c_long(510)

论坛徽章:
0
12 [报告]
发表于 2009-01-06 14:02 |只看该作者
原帖由 luffy.deng 于 2009-1-6 13:10 发表
是B的确没有改变va1,va2的值,还是不能用c++ 的dll?我用一个c的dll试了一下可以

import ctypes
tt=ctypes.CDLL('add.dll')
g1 = ctypes.c_int(10)
g2 =  ctypes.c_int(15)
print g1,g2
tt.lkadd(ctypes ...



不清楚是否是ctypes对C++不支持。

我确定了下我使用的DLL是使用C写的,B函数(Int B (int Handle, ref long Len_s1, ref long Len_s2))的那种写法是因为有一个C#的程序需要调用,而且好像C#对引用的要求是否是这个样子就不清楚了。

因为我使用的DLL是需要调用底层驱动获得Len_s1,Len_s2的值并通过B函数传出来的,从目前情况来看,好像是python这边没有什么问题,是不是在Python调用时,造成DLL根本就没有调用底层驱动,所以才导致Len_s1,Len_s2始终为零?

唉~被这个搞的都有点崩溃了的感觉

[ 本帖最后由 Heaice 于 2009-1-6 14:03 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2009-01-06 14:10 |只看该作者
原帖由 Heaice 于 2009-1-6 14:02 发表



不清楚是否是ctypes对C++不支持。

我确定了下我使用的DLL是使用C写的,B函数(Int B (int Handle, ref long Len_s1, ref long Len_s2))的那种写法是因为有一个C#的程序需要调用,而且好像C#对引用的要 ...

可以考虑一下是不是函数B就没有对va1,va2进行修改。可以查一下B的返回值

[ 本帖最后由 luffy.deng 于 2009-1-6 14:13 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2009-01-06 14:32 |只看该作者
原帖由 luffy.deng 于 2009-1-6 14:10 发表

可以考虑一下是不是函数B就没有对va1,va2进行修改。可以查一下B的返回值



从调用函数B的返回值为来看,确实是取到了va1,va2。

但是不清楚为啥就成这个样子了,本来以为是python这边的问题,现在看来好像又不是

看来得从DLL这边下手瞧瞧了。


另外,想问下,不知道网络上有没有python实现取得一定时间内磁盘读写文件大小的代码活着是实现方法?

[ 本帖最后由 Heaice 于 2009-1-6 14:35 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2009-01-06 19:29 |只看该作者
不知道你要干什么用。调用sar能不能得到?

论坛徽章:
0
16 [报告]
发表于 2009-01-07 10:12 |只看该作者
原帖由 luffy.deng 于 2009-1-6 19:29 发表
不知道你要干什么用。调用sar能不能得到?



sar是python的一个库还是什么?

那里可以找到?虽然目前不清楚是否能够满足要求,但是可以尝试下

论坛徽章:
0
17 [报告]
发表于 2009-01-07 10:15 |只看该作者
sar是linux下的命令,用于系统监控,一般都自带了。主页在http://pagesperso-orange.fr/sebastien.godard/download.html

[ 本帖最后由 luffy.deng 于 2009-1-7 10:17 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2009-01-07 10:30 |只看该作者
#! /usr/env/python
from ctypes import *
test = CDLL("testdll"
A = test.A
A.restype = c_int
B = test.B
B.restype = c_int
B.argtypes = [c_int, c_void_p, c_void_p]
va1 = c_int()
va2 = c_int()

s2 = B(A(), byref(va1), byref(va2) )
print s2, va1, va2


// 测试dll的头文件
#ifndef  TEST_DLL_H
#define  TEST_DLL_H
#define DLLPORT __declspec(dllexport)
extern "C" DLLPORT int A();
extern "C" DLLPORT int B(int handle, int *s1, int* s2);
#endif

// 测试dll的实现文件
#include "testdll.h"
int A()
{
return 1;
}
int B(int handle, int *s1, int* s2)
{
*s1 = 76;
*s2 = 88;
return handle;
}

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
      )
{
    return TRUE;
}


# 输出结果:
1 c_long(76) c_long(8

因此,你应该仔细查看你的dll返回值是否正确,而不是去判断python的代码是否有问题!

论坛徽章:
0
19 [报告]
发表于 2009-01-07 11:40 |只看该作者
在这里衷心感谢luffy.deng和newrain 的热心帮助。

原帖由 luffy.deng 于 2009-1-7 10:15 发表
sar是linux下的命令,用于系统监控,一般都自带了。主页在http://pagesperso-orange.fr/sebastien.godard/download.html



我是应用在windows系统下,所以,就只能另寻它法了。

原帖由 newrain 于 2009-1-7 10:30 发表
#! /usr/env/python
from ctypes import *
test = CDLL("testdll")
A = test.A
A.restype = c_int
B = test.B
B.restype = c_int
B.argtypes = [c_int, c_void_p, c_void_p]
va1 = c_int()
va2 = c_in ...

# 输出结果:
1 c_long(76) c_long(8

因此,你应该仔细查看你的dll返回值是否正确,而不是去判断python的代码是否有问题!



因为学习python时间比较短,并且第一次使用python调用DLL,再加上该DLL在另一个程序中使用正常,所以,就以为是python代码那里出现了问题所导致。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP