下载MetaTrader 5
要添加评论,请登录注册
有问题询问应用程序开发者吗? - 在注释里提问
john.cheng
26
john.cheng 2008.09.08 03:37 

由于工作需要,我的很多内容需要写到C#的Dll中,但是MT4的dll接口是C++的标准Dll接口。为了连接上C#dll,测了两种方式。

一,直接调用C# dll

用C#创建Dll,没有什么特殊的设定,一种是普通的方式产生dll,一种编译成com interop模式,不过这两种模式在MT4调用的时候都产生127错误。不知道时候有什么特殊的设定可以让MT4直接调用C# dll.

二,间接调用C# dll

无法直接调用,只好想间接方法了。创建了一个适合MT4调用的C++dll,再从这个C++dll调用C#dll,由于MT4不好调试,特意创建了一个C++.net软件用来测试dll的调用,该软件直接调用C#dll 与调用C++dll(该dll中又调用了C#dll)间接调用C#都没有问题。但是把这个C++dll 与C#dll 放在MT4的libraries下时,MT4运行时产生致命错误。如果MT4在调用C++dll时,把c++中的调用C#的代码屏蔽掉,则运行正常。

也就是说C++软件到C++dll再到C#dll没有问题;

MT4到C++dll也没有问题;

MT4到C++dll再到C#dll却出现致命错误(C# com interop模式时也不行);

请高手们指点,谢谢。

以下是程序代码:

MT4 EA**********************************************************

#include <WinUser32.mqh>
#import "Mt4analysic2.dll"
int add(int x,int y);
#import

//---- input parameters
extern string user;
extern string password;

int init()
{
return(0);
}
int deinit()
{
return(0);
}
int start()
{
double x=1;
double y=3;
if(startFlag==0){
double sRet=add1(x,y);
// MessageBox("start function 0,startFlag= "+startFlag+",sret="+sRet,"Attention",MB_OK|MB_ICONWARNING);
}else{
double sRet1=add1(x,y);
//string sRet2=DoubleToStr(sRet1,0);
//MessageBox("start function 1,startFlag= "+startFlag+",sret1="+sRet2,"Attention",MB_OK|MB_ICONWARNING);
}
return(0);
}

//C++dll*********************************************
#include <windows.h>
#include <stdio.h>
#include <string>

using namespace std;

#using "MT4analysic2.dll"
using namespace MT4analysic;
using namespace System;

#define MT4_EXPFUNC __declspec(dllexport)


//+------------------------------------------------------------------+
#pragma pack(push,1)
#pragma pack(pop)
//----
struct MqlStr
{
int len;
char *string;
};
static int CompareMqlStr(const void *left,const void *right);

BOOL APIENTRY _tmain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
//----
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}

//----
return(TRUE);
}
extern "C"{
MT4_EXPFUNC double __stdcall add1(double x,double y)
{
double aRet=5;

int aRet1=5;
int x1=(int)x;
int y1=(int)y;
//以下两行调用C#dll都屏蔽掉时,MT4调用正常。

Mt4Proxy ^dllclass = gcnew Mt4Proxy();
aRet1= dllclass->add(x1,y1);
return aRet1;

}

//C# dll*************************************************************

using System;
using System.Collections.Generic;
using System.Text;

using System.Runtime.InteropServices;

namespace MT4analysic
{
public class Mt4Proxy
{
public int add(int x, int y) {
return x + y;
}
}
}

john.cheng
26
john.cheng 2008.09.08 03:46  

MT4产生的致命错误:

There has been a critical error
Time : 2008.09.08 10:44
Program : Client Terminal
Version : 4.00 (build: 218, 26 Aug 2008)
OS : Windows XP Professional 5.1 Service Pack 2 (Build 2600)
Processors : 1 x X86 (level 15)
Memory : 490992/115336 kb
Exception : E0434F4D
Address : 7C81EB33
Access Type : NA
Access Addr : 00000000

Registers : EAX=027AEEC0 CS=001b EIP=7C81EB33 EFLGS=00000202
: EBX=001A4618 SS=0023 ESP=027AEEBC EBP=027AEF10
: ECX=00000000 DS=0023 ESI=027AEF4C FS=003b
: EDX=00000025 ES=0023 EDI=E0434F4D GS=0000

Stack Trace : 79F97065 79F972D0 7A0A129E 7906EF54
: 7906EBC0 7906E8DB 7906E831 79E9776F
: 79E976E5 79E9767A 79E97516 7C92EE18
: 7C92EE18 7C92EE18 7C92EE18 7C92EE18

Modules :
1 : 00400000 007F5194 c:\program files\metatrader\terminal.exe
2 : 02BF0000 00102000 c:\windows\winsxs\x86_microsoft.vc80.debugcrt_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_f75eb16c\msvcm80d.dll
3 : 0FFD0000 00028000 c:\windows\system32\rsaenh.dll
4 : 10000000 00016000 c:\program files\metatrader\experts\libraries\mt4analysic.dll
5 : 10200000 00120000 c:\windows\winsxs\x86_microsoft.vc80.debugcrt_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_f75eb16c\msvcr80d.dll
6 : 10480000 000FC000 c:\windows\winsxs\x86_microsoft.vc80.debugcrt_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_f75eb16c\msvcp80d.dll
7 : 20000000 00549000 c:\windows\system32\xpsp2res.dll
8 : 5AD70000 00038000 c:\windows\system32\uxtheme.dll
9 : 5E380000 00089000 c:\windows\microsoft.net\framework\v2.0.50727\diasymreader.dll
10 : 60FD0000 00055000 c:\windows\system32\hnetcfg.dll
11 : 61BE0000 0000D000 c:\windows\system32\mfc42loc.dll
12 : 62C20000 00009000 c:\windows\system32\lpk.dll
13 : 719C0000 0003E000 c:\windows\system32\mswsock.dll
14 : 71A00000 00008000 c:\windows\system32\wshtcpip.dll
15 : 71A10000 00008000 c:\windows\system32\ws2help.dll
16 : 71A20000 00017000 c:\windows\system32\ws2_32.dll
17 : 72C80000 00008000 c:\windows\system32\msacm32.drv
18 : 72C90000 00009000 c:\windows\system32\wdmaud.drv
19 : 73640000 0002E000 c:\windows\system32\msctfime.ime
20 : 73D30000 000FE000 c:\windows\system32\mfc42.dll
21 : 73FA0000 0006B000 c:\windows\system32\usp10.dll
22 : 74680000 0004B000 c:\windows\system32\msctf.dll
23 : 759D0000 000AE000 c:\windows\system32\userenv.dll
24 : 762F0000 00005000 c:\windows\system32\msimg32.dll
25 : 76300000 0001D000 c:\windows\system32\imm32.dll
26 : 76320000 00047000 c:\windows\system32\comdlg32.dll
27 : 765E0000 00092000 c:\windows\system32\crypt32.dll
28 : 76990000 0013D000 c:\windows\system32\ole32.dll
29 : 76B10000 0002A000 c:\windows\system32\winmm.dll
30 : 76C00000 0002E000 c:\windows\system32\wintrust.dll
31 : 76C60000 00028000 c:\windows\system32\imagehlp.dll
32 : 76DB0000 00012000 c:\windows\system32\msasn1.dll
33 : 770F0000 0008C000 c:\windows\system32\oleaut32.dll
34 : 77180000 00102000 c:\windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.2600.2180_x-ww_a84f1ff9\comctl32.dll
35 : 77BA0000 00007000 c:\windows\system32\midimap.dll
36 : 77BB0000 00015000 c:\windows\system32\msacm32.dll
37 : 77BE0000 00058000 c:\windows\system32\msvcrt.dll
38 : 77D10000 0008F000 c:\windows\system32\user32.dll
39 : 77DA0000 000A9000 c:\windows\system32\advapi32.dll
40 : 77E50000 00091000 c:\windows\system32\rpcrt4.dll
41 : 77EF0000 00047000 c:\windows\system32\gdi32.dll
42 : 77F40000 00076000 c:\windows\system32\shlwapi.dll
43 : 78130000 0009B000 c:\windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd\msvcr80.dll
44 : 79000000 00045000 c:\windows\system32\mscoree.dll
45 : 79060000 00053000 c:\windows\microsoft.net\framework\v2.0.50727\mscorjit.dll
46 : 790C0000 00AE6000 c:\windows\assembly\nativeimages_v2.0.50727_32\mscorlib\62c98dd25f77b84d873edfcb7a274664\mscorlib.ni.dll
47 : 79E70000 00561000 c:\windows\microsoft.net\framework\v2.0.50727\mscorwks.dll
48 : 7A440000 007BE000 c:\windows\assembly\nativeimages_v2.0.50727_32\system\e0864aead013344fb1deec4bd6a1a959\system.ni.dll
49 : 7C800000 0011C000 c:\windows\system32\kernel32.dll
50 : 7C920000 00094000 c:\windows\system32\ntdll.dll
51 : 7D590000 007F2000 c:\windows\system32\shell32.dll

Call stack :

john.cheng
26
john.cheng 2008.09.08 06:32  

参考 '.NET DLL calls from mq4. Is it possible? Any sample?' 的C#写法,用unsafe static ,并且由于没有GAC,把C#dll 拷贝到MT4的根目录,而不是libraries下,

测试后,已经可以连接到C#dll, 至于我上面的非unsafe static写法的测试,另找时间测试。,

john.cheng
26
john.cheng 2008.09.09 05:09  

出现以上致命错误的另一大原因,是变量类型造成,MT4的数值型变量问题不大,不过,字符型变量在各个环境中的转换应当小心,

MT4,C++,C#中都有string,但是三者都不一样,MT4的string,到C++用Char * 来接收,C++的char*与C#的char*又不一样,C++的wchar_t* 才是C#的char*,关于C++下各种字符转换可以参考

http://msdn.microsoft.com/zh-cn/library/ms235631(VS.80).aspx

XRZN
3
XRZN 2008.09.28 10:48  
应该是从Unmanaged Code 调用managed code 时安全性限制造成的.
topea
74
topea 2008.09.29 01:47  
delphi做的dll调用比较顺畅
何双
6
何双 2008.12.10 11:35  
johnischeng 写道 >>
你好,我刚刚学习MQL4几天,感觉功能限制 太大,想调用C++ DLL,但是始终调用不成功,我QQ 1019007821,希望您能指教下!!
何双
6
何双 2008.12.10 11:35  
johnischeng 写道 >>
你好,我刚刚学习MQL4几天,感觉功能限制 太大,想调用C++ DLL,但是始终调用不成功,我QQ 1019007821,希望您能指教下!!
/
要添加评论,请登录注册