以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]尝试读取或写入受保护的内存。这通常指示其他内存已损坏  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=130430)

--  作者:chnfo
--  发布时间:2019/1/22 0:01:00
--  [求助]尝试读取或写入受保护的内存。这通常指示其他内存已损坏
有一个计划任务,定期执行,设定的间隔时间为1秒。
执行过程中,有时候会报出错误

---------------------------
版本:2018.10.9.1
---------------------------
代码执行出错,错误信息:



System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

   在 UserCode.自定义函数XX

   在 UserCode.Test()


这个跟什么有关?
是执行频率太高了还是怎么的?

--  作者:有点甜
--  发布时间:2019/1/22 9:42:00
--  

1、可以把间隔弄大一点测试;

 

2、进入执行的时候,有可能计划需要执行的时间超过1秒,超过1秒后,又会重新开启一个或者多个计划,导致冲突的。

 

进入计划后,把计划关闭,如 mytimers("计划1").Enabled = False

 

执行到最后,写代码开启 mytimers("计划1").Enabled = True


--  作者:chnfo
--  发布时间:2019/1/22 14:10:00
--  
本来是去检查锁在不在,用时会很短的,但是调了间隔10分钟,还是会报错。 另外,本来就是在项目管理-计划管理中增加的计划,如何让它停止又重启啊
--  作者:有点甜
--  发布时间:2019/1/22 14:24:00
--  

在计划那里写代码,如

 

mytimers("计划1").Enabled = False

\'本来代码

mytimers("计划1").Enabled = true


--  作者:chnfo
--  发布时间:2019/1/23 19:44:00
--  
实际检查了一下,运行结果与设置间隔时间有关,但更大的问题是调用外部的dll
为了测试加密狗的应用,用了ET99加密锁。------如果有使用过这个狗的,更请指教。
但实际测试过程中,按步骤找到狗、打开狗都没有问题,但在第三步做用户PIN验证时,就报出错误如下:
版本:2018.10.9.1
代码执行出错,错误信息:
System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
   在 UserCode.et_Verify(Int64 et99handle, Int32 et99flag, String& et99pin)
   在 UserCode.Test()

经过咨询狗的厂商客服,他们表示在多种环境下,包括Delphi、VB、foxpro等都没有任何问题,而且我用他们的示例文件也运行正常。
那么,这个问题在哪里呢?
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:et99cs.zip


补充:我的电脑Win10操作系统,另一台WIn7操作系统,均是64位。
win10是framework4.7
[此贴子已经被作者于2019/1/23 21:12:54编辑过]

--  作者:有点甜
--  发布时间:2019/1/23 21:25:00
--  

我没有插上加密狗,测试没有报错。

 

你试试改成这样测试

 

Declare Function et_Verify Lib "FT_ET99_API.dll" (ByVal et99handle As Long, ByVal et99flag As Integer, ByRef et99pin As Stringbuilder) As Long

 

-----------------

 

Dim PID As String = "1Q2W3E4R"   \'这是随便写的8位字符串,它要用狗的产生方法产生,在没插狗的情况下,本无意义
Dim n As Integer
Dim Upin As String = "IUHJHJODAHFOIUQWELJADFIO09ER089724502875"   \'这是随便写的字符串,在没插狗的情况下,本无意义
Dim hl As Long

et_FindToken(pid , n )
MessageBox.Show("检测狗完成")

et_OpenToken(hl , pid , 1)
MessageBox.Show("打开狗完成")

Dim sb As new Stringbuilder
sb.append(Upin)
et_Verify(hl , 0, sb)  \'我在插上狗,PID和UPIN都正确的情况下,前两步都顺利完成,但这一步就报错了
MessageBox.Show("验证用户ID完成")

 


--  作者:chnfo
--  发布时间:2019/1/23 21:44:00
--  
这个逻辑是这样的
1、et_findtoken(PID,count),PID是输入值,输出值是count,也就是检测匹配上PID的狗的数量
2、et_OpenToken(hl , pid , 1),第一个参数hl是输出值,它是句柄;第二个参数值是狗的PID,第三个参数值是第几个狗
-----这两步都执行正常。
3、et_Verify(hl , 0, sb),第一个参数是用到第二步输出的句柄,第二个参数0是输入值,是确定是普通用户还是超级用户,第三个sb是输入值,是生成狗的PID时用到的用户参数PIN
-----甜兄,按你的做法,还是不行,仍然报错,报的错是完全一样的

在不插入狗的情况下,就是不做任何改动,我上传的附件可以也是可以走完的。
实际上这个逻辑并不是这么简单,本来是这么写的
et_findtoken(PID,count)
if count > 0 then 
    if  et_OpenToken(hl , pid , 1) = 0 then 
        output.show("打开狗失败")
    else
        if  et_Verify(hl , 0, sb) > 0 then 
              output.show("校验成功")
        else
              output.show("校验失败")
        end if 
    end if 
else
    output.show("没找到狗")
end if 
[此贴子已经被作者于2019/1/23 21:55:39编辑过]

--  作者:chnfo
--  发布时间:2019/1/23 21:53:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:et99_sample_vb.zip

这是厂家官网给出的VB示例,就是用来做狗的相关设置的。
我这里插上狗后,从头到尾测试都正常。

--  作者:chnfo
--  发布时间:2019/1/23 21:53:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:et99_sample_vb.zip

这是厂家官网给出的VB示例,就是用来做狗的相关设置的。
我这里插上狗后,从头到尾测试都正常。

--  作者:有点甜
--  发布时间:2019/1/23 22:04:00
--  

有没有c#的实例?

 

http://converter.telerik.com/