以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://www.weistock.com/bbs/index.asp)
--  高级功能研发区  (http://www.weistock.com/bbs/list.asp?boardid=5)
----  [求助]vba如何读取指定注册表键值?  (http://www.weistock.com/bbs/dispbbs.asp?boardid=5&id=63612)

--  作者:bbking
--  发布时间:2014/4/8 13:41:34
--  [求助]vba如何读取指定注册表键值?
比如我在后台里有句
把这个键值赋值成目前的交易时间供vba读取~
SETREGVAL(\'vba\',\'mailtime\',dynainfo(207));

但是vba如何读取我后台写入的指定的注册表键值呢?
下面这句没看懂~都不知道注册表键值去哪里找

\'测试注册表读写
Sub TestRegistry()
 Set registry = CreateObject("stock.registry")
 Call registry.Open("software\\weisoft\\金字塔\\settings")
 Call registry.WriteInt("id",123)
 result=registry.ReadInt("id")
 application.msgout result
End Sub


--  作者:王锋
--  发布时间:2014/4/8 18:31:04
--  

Sub TestRegistry()
 Set registry = CreateObject("stock.registry")
 Call registry.Open("software\\weisoft\\金字塔\\vba")
  result=registry.ReadInt("id")
 application.msgout result
End Sub

 

这样试试


--  作者:bbking
--  发布时间:2014/4/9 9:26:45
--  
图片点击可在新窗口打开查看


application.msgout result
这句弹不出来啊~

SETREGVAL(\'vba\',\'mailtime\',dynainfo(207));
我要使用mailtime这个键值~用vba与后台做应答~
怎么在vba里面调用出这个键值~

--  作者:王锋
--  发布时间:2014/4/9 9:52:34
--  
没弹出来说明这个VBA语句没有运行,你可以再把需求描述的清楚一些,我们再看看如何帮你解决
--  作者:bbking
--  发布时间:2014/4/9 10:01:59
--  
首先用后台运行这句
SETREGVAL(\'vba\',\'mailtime\',dynainfo(207));
把时间赋值给注册表

然后用vba读取注册表这个键值~
vba再引用当前交易时间与这个键值对比~

if vba引用的当前交易时间-注册表键值>20秒 then begin//判断后台无应答为假死状态

StopAlarmRun       停止后台程序化预警

(这里可能需要停顿5-10秒,再启动后台)

StartAlarmRun      启动后台程序化预警

end


防止后台假死


--  作者:bbking
--  发布时间:2014/4/9 15:57:54
--  
帮我想想办法啊
--  作者:王锋
--  发布时间:2014/4/9 18:38:43
--  

\'VBA启动时事件
Sub APPLICATION_VBAStart()
   Application.MsgOut "监控后台启动工作"
   Application.SetTimer 1, 3000 \'设定3秒定时器
End Sub

 

Sub APPLICATION_Timer(ID)
  
   If ID = 1 Then
       MyTime = CStr(Hour(Time))+CStr(Minute(Time))+CStr(Second(Time))
       PelTime = TestRegistry()
       Application.MsgOut CLng(MyTime) - PelTime
       If CLng(MyTime) - PelTime > 20 Then
           Application.MsgOut "发现后台异常,正在重启后台程序化"
           MarketData.StopAlarmRun
           MarketData.StartAlarmRun
       End If
   End If
End Sub

 

Function TestRegistry()
 Set registry = CreateObject("stock.registry")
 Call registry.Open("software\\weisoft\\金字塔\\vba")
  result=registry.ReadInt("id")
 TestRegistry = result
 set registry = nothing \'对象使用完要释放,负责会出现内存泄露
End Function


--  作者:bbking
--  发布时间:2014/4/10 1:23:50
--  
谢谢这段vba代码
很好的范例
[此贴子已经被作者于2014/4/10 1:24:07编辑过]

--  作者:bbking
--  发布时间:2014/4/23 13:59:57
--  
写个后台demo9003~就下面一段代码~
监控IF05~分笔周期高频刷新

SETREGVAL(\'vba\',\'mailtime\',dynainfo(207));

启动VBA运行7楼代码总是不断循环开关后台
   If ID = 1 Then
       MyTime = CStr(Hour(Time))+CStr(Minute(Time))+CStr(Second(Time))
       PelTime = TestRegistry()
      ‘ Application.MsgOut CLng(MyTime) - PelTime
Application.MsgOut CLng(MyTime)
Application.MsgOut PelTime
       If CLng(MyTime) - PelTime > 20 Then
           Application.MsgOut "发现后台异常,正在重启后台程序化"
           MarketData.StopAlarmRun
           MarketData.StartAlarmRun
       End If
   End If
End Sub

上面那句改一下~发现PelTime一直为0
~是否说明注册表读取出错?VBA一直没有读到正确的GETREGVAL(\'vba\',\'mailtime\',0)这个数值

--  作者:王锋
--  发布时间:2014/4/23 14:05:37
--  

是的,你的注册表这个值有问题,你可以打开注册表编辑器,看看里面的数值到底PEL公式置进去没有