首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"WindowsError:例外:访问冲突.“-类型问题

"WindowsError:例外:访问冲突.“-类型问题
EN

Stack Overflow用户
提问于 2009-09-05 00:35:26
回答 2查看 26.2K关注 0票数 6

下面是驻留在DLL中的C函数的原型:

代码语言:javascript
复制
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一起编辑的

代码语言:javascript
复制
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。如果这是不清楚,我道歉,并将尝试编辑这篇文章。

第二次编辑:有人建议插入设备,看看这是否有帮助。我刚插上了青蛙的插头,但我还是会犯同样的错误。很奇怪,而且我很无知。无论如何,再次感谢大家!

EN

回答 2

Stack Overflow用户

发布于 2009-09-10 03:18:18

您所得到的错误与管理权限无关。问题是您正在使用C,并且无意中执行非法操作(如果不检查的话,这种操作很可能会使您的系统崩溃)。

您收到的错误指示您的程序试图写入内存地址1001,但不应该写入该内存地址。

发生这种情况的原因有很多。

一个可能的原因是,传递给ReturnPulse的double*没有ReturnPulse预期的那么大。你可能至少需要让GetSize正常工作..。您可以通过分配一个非常大的数组而不是调用GetSize来解决这个问题。即

代码语言:javascript
复制
ptrfdP = (c_double*100000)()

这将分配100,000倍,这可能更适合捕捉数字脉冲。

另一个问题是类型转换可能没有按预期进行。

如果ctype知道ReturnPulse需要5个双指针,那么运气可能会更好。即

代码语言:javascript
复制
# 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中所做的事情:

代码语言:javascript
复制
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调用它:

代码语言:javascript
复制
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]))

结果的输出是

代码语言:javascript
复制
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,代码也不会出现错误。

票数 13
EN

Stack Overflow用户

发布于 2010-01-19 14:13:07

Ptr脉冲和好友是指向各种ctype对象的python标识符(我猜它们都是c_double*2)。它们要么需要用ctype指针对象包装,要么使用ctypes.byref传递给C函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1382076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档