欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → VBS自动化调用C++,C++ OLE异常,求救!

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有4950人关注过本帖树形打印复制链接

主题:VBS自动化调用C++,C++ OLE异常,求救!

帅哥哟,离线,有人找我吗?
wsslei
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:260 积分:313 威望:0 精华:0 注册:2012/10/15 23:46:48
VBS自动化调用C++,C++ OLE异常,求救!  发帖心情 Post By:2014/8/22 11:29:14 [只看该作者]

基本情况:

我是用图表指标逐K线调用VBS,VBS主要用Gethistorydata取5s数,给C++,复杂的逻辑计算放在C++里头。同时C++里头拟调用数据库 SQlite。 

这么做的原因是,模型不成熟,最好还是用图表可以观察观察。同时因为计算量大,所以之前VBS+access的效率不可用,所以想挪到C++里,也换轻型的内存数据库 SQlite。同时也可以利用VBS的Order之类的,以后换成Adi,或者DLL改动也少。

测试环境:

WIN7 64位,VS2008+SP1,Debug 32,金字塔 2.962可调试版本


程序如下:

PEL:   R_INIT:= INIT_1(1540);

VBS: 

Function INIT_1(Formula,N)

    INIT_1=0
   
    Set Grid = Formula.ParentGrid
    Set History = Grid.GetHistoryData
    
    daysnumber = DateDiff("d", #1/1/1970# , History.date(0) )
    time_temp = right(History.date(0),8)
    timesnumber = 60*60*hour(time_temp)+ 60* minute(time_temp) + second(time_temp)       
    
    date_5s = daysnumber
    time_5s = timesnumber 
    open_5s = History.open(0)
    close_5s = History.close(0)
    high_5s = History.high(0)
    low_5s = History.low(0)       
  
    date_1m =  daysnumber  ‘一分钟与5分钟暂用5秒的代替
    time_1m = timesnumber 
    open_1m = History.open(0)
    close_1m = History.close(0)
    high_1m = History.high(0)
    low_1m = History.low(0) 
    
    date_5m = daysnumber
    time_5m = timesnumber 
    open_5m = History.open(0)
    close_5m = History.close(0)
    high_5m = History.high(0)
    low_5m =  History.low(0)  
  
    Set MyAddin = CreateObject("MyActiveXDemo.VBSAddin")

    call MyAddin.INIT_1(date_5s,time_5s,open_5s,close_5s,high_5s,low_5s,date_1m,time_1m,open_1m,close_1m,high_1m,low_1m,date_5m,time_5m,open_5m,close_5m,high_5m,low_5m)

End Function

C+: 

float VBSAddin::INIT_1(long Date_5s, long Time_5s, float Open_5s, float Close_5s, float High_5s, float Low_5s, long Date_1m, long Time_1m, float Open_1m, float Close_1m, float High_1m, float Low_1m, long Date_5m, long Time_5m, float Open_5m ,float Close_5m, float High_5m, float Low_5m) 
{

   sqlite3 *db=NULL;
   char *zErrMsg = 0;
   int rc;
   //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
   rc = sqlite3_open("test1.db", &db);

   if(rc)
   {
        fprintf(stderr, "Can’t open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return (1); 
   }
   else
        printf("You have opened a sqlite3 database named Winstock.db successfully!\n"); 
 
   return 0.0f;
}

问题,是只要加了rc = sqlite3_open("test1.db", &db); 附加进程调试的断点,就进不去了,同时还有OLE异常错误,如下图
而,我没有OLE的单独的sqlite测试是没问题的。

自己用try catch也没找到错误,请大哥们帮忙看看


图片点击可在新窗口打开查看此主题相关图片如下:1.gif
图片点击可在新窗口打开查看


我附上VC的包,   太大了 ,我可以发邮件

江湖救急,多谢了!


 回到顶部
帅哥哟,离线,有人找我吗?
王锋
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:罗宾汉 帖子:11808 积分:20695 威望:0 精华:10 注册:2009/8/18 8:15:13
  发帖心情 Post By:2014/8/22 11:57:36 [只看该作者]

逐K线模式下你这种使用方法是让人蛋疼的,你自己应该能想到每根K线都去调用一次,你的代码这样没有效率的反复进行初始化操作,不断打开和关闭数据库。

 

我们没有办法为你免费修改你的代码,但是可以给你提供一个效率较高的思路。

1,将 Set MyAddin = CreateObject("MyActiveXDemo.VBSAddin") 放到外面做为全局变量使用

2,判断Formula.barpos=0时这是第一次调用第一根k线,你要做的事情就是对代码进行初始化,比如做数据库的打开及初始化动作

3,然后Formula.barpos>0时你就可以把之前打开并初始化过的数据直接做处理了,这样效率会提高很多,希望对你能有所帮助



金字塔—专业程序化软件提供商

金字塔-技术部

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

工作时间:周一至周五 08:30 - 17:30   周末及法定节假日休息

Email:service@weistock.com
 回到顶部
帅哥哟,离线,有人找我吗?
wsslei
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:260 积分:313 威望:0 精华:0 注册:2012/10/15 23:46:48
  发帖心情 Post By:2014/8/22 13:40:09 [只看该作者]

王老师,多谢了!

其实我PEL代码没写全,在公式初次调用时,会按bapos =0与>0 分别进行处理的

盘中动态时,会用论坛 KLC的方式,每K线跳动,只刷末根线1次

主要是调用时创建数据库出错了,我去再研究吧,谢谢了

 回到顶部
帅哥哟,离线,有人找我吗?
wsslei
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:260 积分:313 威望:0 精华:0 注册:2012/10/15 23:46:48
  发帖心情 Post By:2014/8/29 14:14:51 [只看该作者]

王老师,免费查错不方便,要不付费可以吗? 总得弄好哈

float VBSAddin::INIT_1(long Date_5s, long Time_5s, float Open_5s, float Close_5s, float High_5s, float Low_5s, long Date_1m, long Time_1m, float Open_1m, float Close_1m, float High_1m, float Low_1m, long Date_5m, long Time_5m, float Open_5m ,float Close_5m, float High_5m, float Low_5m) 
{

   sqlite3 *db=NULL;
   char *zErrMsg = 0;
   int rc;
   //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
   rc = sqlite3_open("test1.db", &db);

   if(rc)
   {
        fprintf(stderr, "Can’t open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return (1); 
   }
   else
        printf("You have opened a sqlite3 database named Winstock.db successfully!\n"); 
 
   return 0.0f;
}

C++ 参数是传进去了,但只要问题,是只要加了rc = sqlite3_open("test1.db", &db); 附加进程调试的断点,就进不去了,同时还有OLE异常错误,我没有OLE的单独的sqlite测试是没问题的。
[此贴子已经被作者于2014/8/29 14:16:08编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
王锋
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:罗宾汉 帖子:11808 积分:20695 威望:0 精华:10 注册:2009/8/18 8:15:13
  发帖心情 Post By:2014/8/29 14:45:23 [只看该作者]

不要用附加进程调试, 请到管网下载 2.962版, 这个版本支持调试的, 建议你在VC6下运行



金字塔—专业程序化软件提供商

金字塔-技术部

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

工作时间:周一至周五 08:30 - 17:30   周末及法定节假日休息

Email:service@weistock.com
 回到顶部
帅哥哟,离线,有人找我吗?
wsslei
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:260 积分:313 威望:0 精华:0 注册:2012/10/15 23:46:48
  发帖心情 Post By:2014/8/29 15:26:26 [只看该作者]

我装了VC6, 也打开了2.962版,不附加进程,但怎么调试呢,请教下,能电话下吗



 回到顶部
帅哥哟,离线,有人找我吗?
王锋
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:罗宾汉 帖子:11808 积分:20695 威望:0 精华:10 注册:2009/8/18 8:15:13
  发帖心情 Post By:2014/8/29 15:53:17 [只看该作者]



金字塔—专业程序化软件提供商

金字塔-技术部

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

工作时间:周一至周五 08:30 - 17:30   周末及法定节假日休息

Email:service@weistock.com
 回到顶部
帅哥哟,离线,有人找我吗?
wsslei
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:260 积分:313 威望:0 精华:0 注册:2012/10/15 23:46:48
  发帖心情 Post By:2014/8/29 16:03:20 [只看该作者]

按上面的做了设置,我理解ADI是在金字塔里运行插件直接进入调试。 我这个是重新调用PEL公式(即关闭PEL公式,再打开)来触发调试,怎么一点反应儿都没有?
要不我下周到你们公司,让老师们指点下?
[此贴子已经被作者于2014/8/29 16:04:41编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
王锋
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:罗宾汉 帖子:11808 积分:20695 威望:0 精华:10 注册:2009/8/18 8:15:13
  发帖心情 Post By:2014/8/29 16:05:51 [只看该作者]

我们也没试过ACTIVEX控件能否进入调试系统,按道理说是应该的,你或者可以采取写文本文件的方式进行调试,也是个比较好的方法


金字塔—专业程序化软件提供商

金字塔-技术部

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

工作时间:周一至周五 08:30 - 17:30   周末及法定节假日休息

Email:service@weistock.com
 回到顶部
帅哥哟,离线,有人找我吗?
wsslei
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:260 积分:313 威望:0 精华:0 注册:2012/10/15 23:46:48
  发帖心情 Post By:2014/8/29 16:13:59 [只看该作者]

我用VS2008,附加进程 2.962,是能进断点的(也是PEL调用VBS+ActiveX) 。我看到进去后参数是传过了。但是传过去后,我要把他弄到数据库就,加了创建数据库语句就没反应了...  要不我把源代码发给你们看看,付费也可以?

 回到顶部
总数 12 1 2 下一页