讨论 "如何在10分钟内为MQL5编写一个DLL并交换数据"。 - 页 6

 
GarF1eld:
使用wchar_t 而不是 char

问题 在mql本身。

 
_DLLAPI void __stdcall demo(char *stream, char *buf){ buf=stream;}

这是什么类型的代码?复制一个指针只是复制了包含地址的4个字节的内存。

在这种情况下,如果你事先(在MQL5程序中)注意在接收行分配必要的缓冲区,memcpy 可以帮助你。

 
stringo:

这是什么类型的代码?复制一个指针只是复制了包含地址的4个字节的内存。

在这种情况下,memcpy 可以帮助你,如果你在接收行(MQL5程序中)注意分配所需的缓冲区。

指针与此有什么关系?这段代码在mql4中完美运行。迁移到mql5后就没有了。

这里每个人都在给建议,但我希望有人能展示一个真正好的例子,说明如何从mql5向dll函数传递字符串。

 
antonix
:

...

问题

有什么问题呢?如何人性化地从MQL向dll传递一个字符串?

1) 谢谢你的留言。该错误已被修复。请等待更新。

2) 关于wchar _t,你已经被正确告知 - MQL5中的字符串是Unicode。

3) 你说的 "在可视化调试中检查时 "是什么意思?

4)这是正确的使用方法。

//--- нужно обеспечить буфер строки для заполнения его в DLL
StringInit(b,256);
//--- вызываем DLL функцию
demo("test",b);
//--- печатаем результат
Print(b);

//--- в DLL
_DLLAPI void __stdcall demo(wchar_t *stream, wchar_t *buf)
  {
   //--- проверим указатель
   if(stream==NULL || buf==NULL) return;
   //--- максимум 256 символов
   wcsncpy(buf,stream,256);
  }
 

谢谢你帮助像我这样挣扎的程序员。:)你的例子给我的情况带来了一些清晰的认识。

我决定写一个函数,将一个字符串 从wchar_t转换 为老式的char。这个函数可能对那些项目中有大量使用char类型的代码的人有用。而且,由于MQL5只传递wchar_t,在输入端进行转换比重写一半的dll代码要容易。

char* w2char(wchar_t* str){
      unsigned int lenght = wcslen(str)+1;
      char* ansi = new char[lenght];
      wcstombs(ansi, str, lenght);
      return ansi;
}
 
antonix:

谢谢你帮助像我这样挣扎的程序员。:)你的例子给我的情况带来了一些清晰的认识。

我决定编写(或第八个,谁可能需要它)函数,将字符串从wchar_t转换为古老的char。这个函数可能对那些项目中有大量使用char类型的代码的人有用。而且,由于MQL5只传递wchar_t,在输入端进行转换比重写一半的dll代码要容易。

当然,接受字符串为char *的DLL函数会取一个指向char类型的数组的第一个元素的指针。这意味着在MQL5程序中描述此类函数的导入时,我们应该使用char数组作为字符串参数。

对于这些情况,我们提供了StringToCharArray 函数,可以正确转换国家字母表中的字符串。wcstombs函数并不总是能正确做到这一点。

 

这篇文章很有意思,很有用。

1) 包括源代码的事实是很酷的。显然,对Megaproger来说,创建它并不是问题。

但如果我不是Mega,也不是Proger呢?)

2)该文章使用了MS的编译器。我对它不太友好:) 我有BC++。你能公布为它调整的源代码吗?

(IMHO, probably, it is always better to post sources for MS and BC, they are two leading companies, but their writing style is different).

 

我们尽量不张贴有潜在危险的代码(DLLs),以免让用户紧张。此外,这只是一个测试例子。

不幸的是,我手头没有Borland C++编译器。试着自己改编一下,它的代码不到一页。

 

yu-sha:

开发商的目标是不是定得太高了?

为什么要重新发明轮子,因为一切都已经在很久以前完成了(C、Delphi...)?

我完全同意。对我来说,例如,一个经过深思熟虑的COM接口,或者在现有的FXRobot Developer Studio 开发策略的框架内;-),至少有可能在DLL中传递一个指向MQL5回调函数的指针,就已经足够。我可能是错的,但我的印象是,到目前为止,这些功能只能导出供内部使用。我认为我们需要脚踏实地地认识到,MT作为一种开发环境,永远无法接近Borland Delphi(Embarcadero RAD Studio)、Visual Studio和其他许多环境。这不是因为开发者的才能,而是因为开发现代IDE所需的巨大资源。我不谈第三方供应商对上述平台的巨大支持,也不谈其他事情。首先,我希望看到开发人员努力创造一个完美的用户界面、标准功能和使用MQL实现用户程序和服务器之间的桥梁,MQL中的程序将充当驱动程序。不要误会我的意思,我不想夺走新手程序员 最喜欢的游戏,但在我看来,专业的程序员和交易员想要得到一个完美的现成的解决方案,而不是一个DIY构造器,应该得到更多的关注。
 

人不应该做看似正确的事,而应该做有益的事。因为有利可图才是正确的。而在这种情况下(MT5+MQL5+服务)--对MetaQuotes来说是巨大的利润(将被偿还数十倍或数百倍),对交易者来说是巨大的利润。只不过不是马上。

把眼光放宽,至少看5年,总是一个好主意。MetaQuotes就做到了这一点。