智能交易网,程序化交易,自动交易,量化交易

 找回密码
 注册

QQ登录

只需一步,快速开始

手机短信登录

参加MT4智能交易编程培训,7课免费在线试听MT4指标,EA代写,或EA指标加密账户远程验证服务 最完善商业MT4跟单系统(0.1秒极速响应不漏单)
为论坛做贡献有奖学金,奖学金可直接换真钱 扫本站微信公 众号部分视频课程指标EA免费得智能交易网MT4操盘神器,扫公众号免费得
查看: 2569|回复: 3

关于字符串数组的dll调用传递

[复制链接]
发表于 2014-11-1 11:11:48 | 显示全部楼层 |阅读模式
赵老师你好!
老版课程第21课中,读取数据库内容,用read()函数的string &dResult[]进行传递接收。
现在新版MT4的string类型是双字节型,这个数组传递出来是空值。
我打算在VC中做char对wchar_t的转换,可结果还不行,帮帮看看这段代码怎么修改,谢谢!

原课程vc代码:
struct MqlStr        //定义一个结构,方便接收
  {
   int               len;
   char*             string;
  };

extern "C" int PASCAL EXPORT read(MqlStr *dResult,int nRow[],int nColumn[])         //dResult传递数据库内容到MT4
{
     ...
     for(int i = nColumn[0]; i < (nRow[0]+1)*nColumn[0] ; i++ )
     {
                    
                dResult[index].string=dbResult [i];                  //赋值
        index++;
     }


    ...
}


由于新版string是wchar_t型,我做了以下修改,但返回值仍然是空值:
struct MqlStr        //定义一个结构,方便接收
  {
   int               len;
   wchar_t*             string;               //修改为wchar_t*类型
  };

extern "C" int PASCAL EXPORT read(MqlStr *dResult,int nRow[],int nColumn[])         //dResult传递数据库内容到MT4
{
     ...
     wchar_t *temp;   
     int nLen;  
     for(int i = nColumn[0]; i < (nRow[0]+1)*nColumn[0] ; i++ )
     {
        nLen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, dbResult[i], -1, NULL, 0 );  
             if (nLen == 0)  
            {  
                 temp=NULL;  
             }  
             temp = new wchar_t[nLen];  
             MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, dbResult[i], -1, temp, nLen );         //把dbResult[i]转换为wchar_t ,存入temp,
       
            wcscpy(dResult[index].string, temp);                //赋值
        index++;
     }


    ...
}
回复

使用道具 举报

发表于 2014-11-5 11:27:38 | 显示全部楼层
恩,是的,这个是很不方便,调用sqlite驱动函数 必须用char*,但是mq4现在 字符串都是wchar_t
我也没有什么好方法。
回复 支持 1 反对 0

使用道具 举报

发表于 2018-12-9 10:55:11 | 显示全部楼层
这个问题现在能解决吗
回复 支持 反对

使用道具 举报

发表于 2018-12-9 10:55:38 | 显示全部楼层
2.4. Unicode字符串和它们在DLL中的使用

字符串现在表示为Unicode字符序列。

记住这一点,并使用适当的Windows函数。例如,使用wininet.dll库来替代 InternetOpenA() 和InternetOpenUrlA(),您应该调用InternetOpenW() 和InternetOpenUrlW()。

该字符串的内部结构在MQL4中(现在只需要12个字节)发生了变化,当传递字符串到DLL时应使用MqlString结构:

#pragma pack(push,1)
struct MqlString
  {
   int      size;       // 32 bit integer, contains the size of the buffer allocated for the string
   LPWSTR   buffer;     // 32 bit address of the buffer that contains the string
   int      reserved;   // 32 bit integer, reserved, do not use
  };
#pragma pack(pop,1)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|sitemap|智能交易网,程序化交易,自动交易,量化交易 ( 苏ICP备08108698号,苏州智德金网络科技股份有限公司版权所有 )

GMT+8, 2019-12-14 07:56 , Processed in 0.074252 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表