注册 登录
编程论坛 VFP论坛

请教一下异常 Fatal error: Exception code=C0000005

weiyisc 发布于 2023-04-26 08:38, 873 次点击
问题描述:
lpParameters=''
lpParameters='his_param_mode=3'
lpParameters=lpParameters+' url='+bllis_url
lpParameters=lpParameters+' rmkj_userno='+czybh
lpParameters=lpParameters+' his_param_dept='+ksbm
lpParameters=lpParameters+' his_param_ward='+ksbm
lpParameters=lpParameters+' his_param_patno='+ALLTRIM(zjkyzsy.zyh)
lpParameters=lpParameters+' inpdate='+strt(left(zjkyz.qstime,10),'.','-')
lpParameters=lpParameters+' outdate='+strt(left(zjkyz.qstime,10),'.','-')

Declare Integer ShellExecute In "Shell32.dll" Integer HWnd,String lpVerb,String lpFile,String lpParameters,String lpDirectory,Long nShowCmd
=Shellexecute(0,"Open",bllis_prog,lpParameters,"",1)
CLEAR DLLS

通过上面代码运行一个外部程序,在开发模式下面没问题。一到客户端下面就报错,不知道是什么问题引起的。

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录


请教给我了,先谢谢。。。
8 回复
#2
吹水佬2023-04-26 09:49
C0000005大多是指针指向一个无效(或禁地)的地址时抛出的底层异常,这个异常虽然可以拦截,但并无有效的容错处理过程,基本上可以说是程序的中止。
有打开文件读写的情况时,打开文件后先检测文件的可读写性,文件句柄是否有效。
有分配内存或读写内存时,分配内存是否成功,检测要读写的内存块(段)是否可读写操作。


[此贴子已经被作者于2023-4-26 09:51编辑过]

#3
weiyisc2023-04-26 10:33
以下是引用吹水佬在2023-4-26 09:49:39的发言:

C0000005大多是指针指向一个无效(或禁地)的地址时抛出的底层异常,这个异常虽然可以拦截,但并无有效的容错处理过程,基本上可以说是程序的中止。
有打开文件读写的情况时,打开文件后先检测文件的可读写性,文件句柄是否有效。
有分配内存或读写内存时,分配内存是否成功,检测要读写的内存块(段)是否可读写操作。


和VFP9.0运行类库有太大关系没有?
#4
吹水佬2023-04-26 11:58
以下是引用weiyisc在2023-4-26 10:33:18的发言:

和VFP9.0运行类库有太大关系没有?

VFP调用自身的函数通常没问题, 但SYS()是例外,如SYS(2600,...)函数读写内存就有可能会抛出这个异常。
VFP程序出现C0000005大都是不正确调用API(或第三方接口模块)引起。
#5
东海ECS2023-04-26 19:11
这个问题的错误代码C0000005表示是读取了非法的内存地址,通常与指针相关。可能原因之一是指针被释放或者未初始化,导致无法访问正确的内存地址。

在代码中,我注意到lpParameters是一个字符串类型的变量,但是在运行时没有被初始化。当你尝试连接字符串时,它可能会尝试访问未初始化的内存地址,导致程序崩溃。

建议对lpParameters初始化为一个空字符串,然后分别连接上其他字符串。例如:

lpParameters = "" lpParameters = lpParameters + 'his_param_mode=3' lpParameters = lpParameters + ' url=' + bllis_url lpParameters = lpParameters + ' rmkj_userno=' + czybh lpParameters = lpParameters + ' his_param_dept=' + ksbm lpParameters = lpParameters + ' his_param_ward=' + ksbm lpParameters = lpParameters + ' his_param_patno=' + ALLTRIM(zjkyzsy.zyh) lpParameters = lpParameters + ' inpdate=' + strt(left(zjkyz.qstime,10),'.','-') lpParameters = lpParameters + ' outdate=' + strt(left(zjkyz.qstime,10),'.','-')


另外,如果你是用Visual FoxPro编写的代码,可以考虑使用VFP已有的函数来执行外部程序,而不是调用Windows API。它们包括SHELLEXECUTE或者RUN等。这样更加方便和可靠,避免一些潜在的错误。
#6
nbwww2023-04-26 19:30
这位朋友还真的是有点
#7
吹水佬2023-04-26 19:52
以下是引用nbwww在2023-4-26 19:30:35的发言:

这位朋友还真的是有点

就怕会变成机械人
#8
iswith2023-04-26 21:12
以下是引用东海ECS在2023-4-26 19:11:44的发言:

这个问题的错误代码C0000005表示是读取了非法的内存地址,通常与指针相关。可能原因之一是指针被释放或者未初始化,导致无法访问正确的内存地址。

在代码中,我注意到lpParameters是一个字符串类型的变量,但是在运行时没有被初始化。当你尝试连接字符串时,它可能会尝试访问未初始化的内存地址,导致程序崩溃。

建议对lpParameters初始化为一个空字符串,然后分别连接上其他字符串。例如:

lpParameters = "" lpParameters = lpParameters + 'his_param_mode=3' lpParameters = lpParameters + ' url=' + bllis_url lpParameters = lpParameters + ' rmkj_userno=' + czybh lpParameters = lpParameters + ' his_param_dept=' + ksbm lpParameters = lpParameters + ' his_param_ward=' + ksbm lpParameters = lpParameters + ' his_param_patno=' + ALLTRIM(zjkyzsy.zyh) lpParameters = lpParameters + ' inpdate=' + strt(left(zjkyz.qstime,10),'.','-') lpParameters = lpParameters + ' outdate=' + strt(left(zjkyz.qstime,10),'.','-')

另外,如果你是用Visual FoxPro编写的代码,可以考虑使用VFP已有的函数来执行外部程序,而不是调用Windows API。它们包括SHELLEXECUTE或者RUN等。这样更加方便和可靠,避免一些潜在的错误。


回答的非常专业,估计 是GTP回答的,一般为读了空指针(理解的话就是那个指针地址VFP知道了,但这个指针地址在第三方你不知道的时候它就释放了,而你又要用VFP去读这个指针地址,然后就COOOOOO5,
《《《另外,如果你是用Visual FoxPro编写的代码,可以考虑使用VFP已有的函数来执行外部程序,而不是调用Windows API。。。。》》》这里说法跟你上面指针说法,牛头不对马嘴,GTP再强也只学习已知的有些逻辑它没有的。。。。。

[此贴子已经被作者于2023-4-26 21:17编辑过]

#9
weiyisc2023-04-26 22:04
感谢各位,我在测试测试。
1