下面是驻留在DLL中的C函数的原型:
extern "C" void__stdcall__declspec(dllexport) ReturnPulse(double*,double*,double*,double*,double*);在另一个线程中,我询问了如何正确地创建和向该函数发送必要的参数。
下面是线程:How do I wrap this C function, with multiple arguments, with ctypes?
所以我在上面的线程中使用了很好的信息,但是现在我得到了以下错误: WindowsError: exception:访问冲突写入0x00001001
我不知道该如何进行。我在Windows上--如果我登录到管理员帐户,这会解决问题吗?或者这是Python的内存对象不可变的问题吗?
谢谢大家!
与相关Python一起编辑的:
FROGPCGPMonitorDLL = windll.LoadLibrary('C:\Program Files\MesaPhotonics\VideoFROG 7.0\PCGPMonitor.dll')
#Function argument:double* pulse
sizePULSE = 2 ##Manual is super unclear here
pulse = c_double * sizePULSE
ptrpulse = pulse()
#Function argument:double* tdl
sizeTRACE = FROGPCGPMonitorDLL.GetSize()
if sizeTRACE == 0 :
sizeTRACE = 1 #Manually set size to 1 for testing purposes
print "Size of FROG trace is zero. Probably not right."
tdl = c_double*sizeTRACE
ptrtdl = tdl()
#Function argument:double* tdP
sizeTRACE = FROGPCGPMonitorDLL.GetSize()
if sizeTRACE==0:
sizeTRACE=1
print "Size of FROG trace is zero. Probably not right."
tdP = c_double*sizeTRACE
ptrtdP = tdP()
#Function Argument:double* fdl
sizeTRACE = FROGPCGPMonitorDLL.GetSize()
if sizeTRACE==0:
sizeTRACE=1
print "Size of FROG trace is zero. Probably not right."
fdl = c_double*sizeTRACE
ptrfdl = fdl()
#Function Argument: double* fdP
sizeTRACE = FROGPCGPMonitorDLL.GetSize()
if sizeTRACE==0:
sizeTRACE=1
print "Size of FROG trace is zero. Probably not right."
fdP = c_double*sizeTRACE
ptrfdP = fdP()
FROGPCGPMonitorDLL.ReturnPulse(ptrpulse, ptrtdl, ptrtdP,ptrfdl,ptrfdP)编辑,添加一些相关的代码!我只是写了一个简单的脚本,让每个设备的功能首先工作。变量sizeTRACE可以重用,我知道,但是它现在只是测试代码,设备没有连接,所以GetSize()返回零。乘以零会扼杀我的嗡嗡声,所以我现在强迫它为1。如果这是不清楚,我道歉,并将尝试编辑这篇文章。
第二次编辑:有人建议插入设备,看看这是否有帮助。我刚插上了青蛙的插头,但我还是会犯同样的错误。很奇怪,而且我很无知。无论如何,再次感谢大家!
发布于 2009-09-10 03:18:18
您所得到的错误与管理权限无关。问题是您正在使用C,并且无意中执行非法操作(如果不检查的话,这种操作很可能会使您的系统崩溃)。
您收到的错误指示您的程序试图写入内存地址1001,但不应该写入该内存地址。
发生这种情况的原因有很多。
一个可能的原因是,传递给ReturnPulse的double*没有ReturnPulse预期的那么大。你可能至少需要让GetSize正常工作..。您可以通过分配一个非常大的数组而不是调用GetSize来解决这个问题。即
ptrfdP = (c_double*100000)()这将分配100,000倍,这可能更适合捕捉数字脉冲。
另一个问题是类型转换可能没有按预期进行。
如果ctype知道ReturnPulse需要5个双指针,那么运气可能会更好。即
# sometime before calling ReturnPulse
FROGPCGPMonitorDLL.ReturnPulse.argtypes = [POINTER(c_double), POINTER(c_double), POINTER(c_double), POINTER(c_double), POINTER(c_double)]如果这两种技术都不起作用,请在ReturnPulse上发送使用文档,这将帮助我们识别预期的用途。
或者更好的是,发送应该在C中工作的示例代码,我将把它转换为ctype中的等效实现。
编辑:添加ReturnPulse和ctype使用的示例实现。
我已经实现了类似于我期望ReturnPulse在C DLL中所做的事情:
void ReturnPulse(double *a, double*b,double*c,double*d,double*e)
{
// write some values to the memory pointed-to by a-e
// a-e should have enough memory allocated for the loop
for(int i = 0; i < 20; i++)
{
a[i] = 1.0*i;
b[i] = 3.0*i;
c[i] = 5.0*i;
d[i] = 7.0*i;
e[i] = 13.0*i;
}
}我将其编译成一个DLL (我称之为examlib),然后使用以下代码使用ctype调用它:
LP_c_double = ctypes.POINTER(ctypes.c_double)
examlib.ReturnPulse.argtypes = [LP_c_double, LP_c_double, LP_c_double, LP_c_double, LP_c_double, ]
a = (ctypes.c_double*20)()
b = (ctypes.c_double*20)()
c = (ctypes.c_double*20)()
d = (ctypes.c_double*20)()
e = (ctypes.c_double*20)()
examlib.ReturnPulse(a,b,c,d,e)
print 'values are'
for array in (a,b,c,d,e):
print '\t'.join(map(str, array[:5]))结果的输出是
values are
0.0 1.0 2.0 3.0 4.0
0.0 3.0 6.0 9.0 12.0
0.0 5.0 10.0 15.0 20.0
0.0 7.0 14.0 21.0 28.0
0.0 13.0 26.0 39.0 52.0实际上,即使没有设置ReturnPulse.argtypes,代码也不会出现错误。
发布于 2010-01-19 14:13:07
Ptr脉冲和好友是指向各种ctype对象的python标识符(我猜它们都是c_double*2)。它们要么需要用ctype指针对象包装,要么使用ctypes.byref传递给C函数。
https://stackoverflow.com/questions/1382076
复制相似问题