请教:用vc++编的DLL中的多个数组变量如何传给mt4?

Discussion in 'MetaTrader' started by 曾戊庚, Jul 27, 2013.

  1. 因为DLL中函数的形式参数中要用到多个数组,且这样的函数还有很多个,每个函数中都存放这么多参数的话,如果函数的数量少的话,是可以正确传到mt4的对应函数中。但函数一多,就会遇到麻烦。且这种方法也不好。
    我试了用全程变量,但怎么试也不正确。
    哪位大侠能帮忙解决这个问题(用全程变量)?谢谢!
     
  2. 不知现在是否已解决。我的解决方法是:
    1) 通过函数调用将数据一个一个的传递。
    2) 通过内核对象如互斥量来保证多线程安全,在DLL初始化时创建内核对象,DLL销毁时关闭内核对象,winxp以后好像不关闭也行。
    3) 增加两函数操作内核对象:enter函数和leave函数。在mt4指标的start函数里面,计算前先调用enter函数,计算结束后调用leave函数。
     
  3. 谢谢!
    我对VC++的了解很表面,不知道“内核对象”是什么。
    问题是解决了,我的解决办法是:因为函数虽多,但功能都差不多,参数也几乎一样,我就把基本相似的函数在MT4里统一为一个函数(a),里面用一个变量来区分不同的函数(b)。DLL中,在a中引用各个b,各个b在DLL中单独编写即可。
     
  4. ^_^ 抱歉!可能很久没写代码了,竟然冒出“内核对象”这种专业术语,抱歉!简单讲,就是使用锁。如果没有全局变量,多线程也不必用锁保护。

    ^_^ 解决就好!够用即可。
     
  5. 真惭愧,“锁”我也不知道是什么意思,说来也是,对我这么外行的人来说(以前自学的一点TC2.0的东西,套在VC++上),编程确实不容易,很多东西都是在网上查找,再拿来用,能够凑合着解决问题就算数,但花的时间是很多的。希望你能多多指导。
     
  6. ^_^ 这要涉及点操作系统原理的东西,如果有兴趣,你可以google或者百度百科都很不错,上面讲的比较容易理解。现在指标没问题的话,不必关心这个。

    ^_^ 也没什么的,也是一回生二回熟的。:D
     
  7. 有了DLL后,MT4上遇到的问题基本上都解决了。
    现在唯一有点烦的是,用VC++6.0编辑源文件时,可能是文件太大,老是出现电脑假死的问题,过10秒左右又正常了,其它都好。准备把DLL分成2个文件,也许好些。
     
  8. 我说的假死,是出现在文件编辑的过程中,而不是出现在编译过程中。
    一开始文件较小时 ,没有这现象,文件渐渐增大后,才慢慢出现这问题的。
    在VC里每改动几个字符,都会出现此问题。
    好在我是把文件在MT4中调整好后,再COPY到VC里,要是在VC里修改或编辑,那一定受不了。
     
  9. ^_^ 做下面的实验前,先备份你的项目。

    试着关闭 Generate browse info。在编译参数设置那里。
    应该在 主要通过VC的菜单项Project->Settings->C/C++那里,在1)General那里,我没VC,你自己找找看,应该是顾名思义的。
    参考这个:
    http://www.cppblog.com/xpzhou/archive/2007/06/08/25807.html

    另外,你单个源文件大概多少行代码?或者说多大?
     
  10. Generate browse info: 没有勾选。
    源代码:21000行。
    VC6的环境: 基本上没有动过。
    刚才下载了英文版,问题依旧:未响应。过几秒钟后就正常了,我习惯了,影响不大。
     
  11. 英文版的VC6打SP6补丁了吗?或者说下载的版本已经集成SP6补丁?

    ^_^ 单个源文件21000行是有点夸张哈。不过我见过更多的,好像也没这情况。

    ^_^ 应该是某个智能选项的问题,如自动完成、拼写检查、VC助手Visual Assist X插件之类的问题,你google一下,然后禁用这些智能选项试试看。

    另外,建议先清理obj之类的项目中间文件。

    机器内存是多少?一般而言,如果不是win7,那么2G左右的内存也行了。如果是现在的机器,内存应该不是问题。

    ^_^ 如果是win7,那么将VC6装在虚拟机WinXP或者windows server 2003上试试看。

    ^_^ 或者换个编辑器,开源的编辑器很多的。

    ^_^ 实在不行,几秒钟的话,就当是磨性子好了。
     
  12. 谢谢! 问题应该是解决了,把“编辑器”中“自动参数信息”前的勾去掉。
    再次感谢,专业高手就是不一样。
     
  13. xde

    xde

    可以把所有全局参数定义到一个结构体里再传递到函数。
     
  14. 我的办法是 有个专门负责传递参数的函数,把数据复制设置到DLL的动态全局变量,其他基本就不用传递参数了。
    获取结果、删除释放DLL的全局变量内存, 类似都用专门函数。

    也就是说,现在调用分多步 1 传递参数,成功才能下步; 2 调用各种处理,获取各种结果......; 3 最后不用了 , 调用函数,删除释放DLL的全局变量内存
    1,2可反复进行
     
  15. VC++6.0编辑源文件时,可能是文件太大,老是出现电脑假死。

    首先是检查是否有什么不良工作的辅助插件, 如 Rsharp#什么的。

    建议升级到新版本吧