MQL4 --- DLL --- PHP???

 

Всем привет. Стоит задача - написать программу, которая будет открывать новые сделки. Параметры сделка (type, symbol, lots...) находятся на удаленном сервере. Программа должна работать в режиме 24 на 7.

Программу написал. Но иногда "выпадает" крешлог:

There has been a critical error

Time : 2010.06.11 18:29

Program : Client Terminal

Version : 4.00 (build: 226, 24 Mar 2009)

OS : Windows XP Professional 5.1 Service Pack 3 (Build 2600)

Processors : 1 x X86 (level 15)

Memory : 982512/726088 kb

Exception : E0434F4D

Address : 7C812AEB

Access Type : NA

Access Addr : 00000000

Registers : EAX=0428F860 CS=001b EIP=7C812AEB EFLGS=00000202

: EBX=E0434F4D SS=0023 ESP=0428F85C EBP=0428F8B0

: ECX=00000000 DS=0023 ESI=0428F8EC FS=0038

: EDX=00000029 ES=0023 EDI=001A87A0 GS=0000

Stack Trace : 79F071AC 79F0A629 7A70C46E 00000000

: 001ADD88 79E74034 C5E8F18B 00000000

: 00000000 00000000 00000000 00000000

: 00000000 00000000 00000000 00000000

Modules :

1 : 00400000 004BB000 c:\program files\metatrader 4 - dealing241\terminal.exe

2 : 03890000 00327000 c:\windows\system32\xpsp2res.dll

3 : 042D0000 00096000 c:\windows\system32\crypt32.dll

4 : 047C0000 00059000 c:\windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456\msvcm90d.dll

5 : 06ED0000 000D5000 c:\windows\system32\comres.dll

6 : 10000000 0000D000 c:\program files\metatrader 4 - dealing241\expertsample.dll

7 : 10200000 00123000 c:\windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456\msvcr90d.dll

8 : 43090000 00045000 c:\windows\system32\iertutil.dll

9 : 433F0000 0012A000 c:\windows\system32\urlmon.dll

10 : 5B260000 00038000 c:\windows\system32\uxtheme.dll

11 : 5BD50000 00056000 c:\windows\system32\netapi32.dll

12 : 5E3A0000 0008D000 c:\windows\microsoft.net\framework\v2.0.50727\diasymreader.dll

13 : 61EC0000 0000E000 c:\windows\system32\mfc42loc.dll

14 : 637A0000 00588000 c:\windows\assembly\nativeimages_v2.0.50727_32\system.xml\c98cb65a79cfccb44ea727ebe4593ede\system.xml.ni.dll

15 : 64890000 000FC000 c:\windows\assembly\nativeimages_v2.0.50727_32\system.configuration\eee9b48577689e92db5a7b5c5de98d9b\system.configuration.ni.dll

16 : 68000000 00036000 c:\windows\system32\rsaenh.dll

17 : 698B0000 00058000 c:\windows\system32\hnetcfg.dll

18 : 71A30000 00040000 c:\windows\system32\mswsock.dll

19 : 71A70000 00008000 c:\windows\system32\wshtcpip.dll

20 : 71A80000 00008000 c:\windows\system32\ws2help.dll

21 : 71A90000 00017000 c:\windows\system32\ws2_32.dll

22 : 72CD0000 00008000 c:\windows\system32\msacm32.drv

23 : 72CE0000 00009000 c:\windows\system32\wdmaud.drv

24 : 73D90000 000FE000 c:\windows\system32\mfc42.dll

25 : 746E0000 0004C000 c:\windows\system32\msctf.dll

26 : 75310000 0002E000 c:\windows\system32\msctfime.ime

27 : 75DA0000 00091000 c:\windows\system32\mlang.dll

28 : 76350000 00005000 c:\windows\system32\msimg32.dll

29 : 76360000 0001D000 c:\windows\system32\imm32.dll

30 : 76380000 00049000 c:\windows\system32\comdlg32.dll

31 : 76B20000 0002E000 c:\windows\system32\winmm.dll

32 : 76C20000 0002E000 c:\windows\system32\wintrust.dll

33 : 76C80000 00028000 c:\windows\system32\imagehlp.dll

34 : 76F10000 00027000 c:\windows\system32\dnsapi.dll

35 : 76FB0000 00006000 c:\windows\system32\rasadhlp.dll

36 : 76FC0000 0007F000 c:\windows\system32\clbcatq.dll

37 : 77110000 0008B000 c:\windows\system32\oleaut32.dll

38 : 773C0000 00103000 c:\windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll

39 : 774D0000 0013D000 c:\windows\system32\ole32.dll

40 : 77910000 00170000 c:\windows\system32\setupapi.dll

41 : 77B10000 00012000 c:\windows\system32\msasn1.dll

42 : 77BC0000 00007000 c:\windows\system32\midimap.dll

43 : 77BD0000 00015000 c:\windows\system32\msacm32.dll

44 : 77BF0000 00008000 c:\windows\system32\version.dll

45 : 77C00000 00058000 c:\windows\system32\msvcrt.dll

46 : 77DC0000 000AC000 c:\windows\system32\advapi32.dll

47 : 77E70000 00092000 c:\windows\system32\rpcrt4.dll

48 : 77F10000 00049000 c:\windows\system32\gdi32.dll

49 : 77F60000 0007C000 c:\windows\system32\shlwapi.dll

50 : 77FE0000 00011000 c:\windows\system32\secur32.dll

51 : 78130000 0009B000 c:\windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.1433_x-ww_5cf844d2\msvcr80.dll

52 : 79000000 00046000 c:\windows\system32\mscoree.dll

53 : 79060000 00056000 c:\windows\microsoft.net\framework\v2.0.50727\mscorjit.dll

54 : 790C0000 00B36000 c:\windows\assembly\nativeimages_v2.0.50727_32\mscorlib\32e6f703c114f3a971cbe706586e3655\mscorlib.ni.dll

55 : 79E70000 0058F000 c:\windows\microsoft.net\framework\v2.0.50727\mscorwks.dll

56 : 7A440000 007EA000 c:\windows\assembly\nativeimages_v2.0.50727_32\system\ba0e3a22211ba7343e0116b051f2965a\system.ni.dll

57 : 7C800000 000F8000 c:\windows\system32\kernel32.dll

58 : 7C900000 000B0000 c:\windows\system32\ntdll.dll

59 : 7C9C0000 01979000 c:\windows\system32\shell32.dll

60 : 7E360000 00091000 c:\windows\system32\user32.dll

Call stack :

Причем он может появится и через 10 минут работы программы, и через 3 часа.

Что касается Dll. Взял готовый код с MSDN (http://msdn.microsoft.com/ru-ru/library/attbb8f5(v=VS.90).aspx)

---MQL4:

#import "ExpertSample.dll"

string SocketSendReceive(string server, int port, string request);

#import

---Visual C++

#define WIN32_LEAN_AND_MEAN

#using <System.dll>

using namespace System;

using namespace System::Net;

using namespace System::Text;

using namespace System::Collections;

using namespace System::Net::Sockets;

using namespace System::Runtime::InteropServices;

Socket^ ConnectSocket(String^ server, int port)

{

Socket^ s = nullptr;

IPHostEntry^ hostEntry = nullptr;

hostEntry = Dns::GetHostEntry(server);

IEnumerator^ myEnum = hostEntry->AddressList->GetEnumerator();

while (myEnum->MoveNext())

{

IPAddress^ address = safe_cast<IPAddress^>(myEnum->Current);

IPEndPoint^ endPoint = gcnew IPEndPoint(address, port);

Socket^ tmpS = gcnew Socket(endPoint->AddressFamily, SocketType::Stream, ProtocolType::Tcp);

tmpS->Connect(endPoint);

if (tmpS->Connected)

{

s = tmpS;

break;

}

else

{

continue;

}

}

return s;

}


__declspec(dllexport) char* __stdcall SocketSendReceive(char* server, int port, char* request)

{

String^ stringServer = gcnew String(server);

String^ stringRequest = String::Concat("GET /" + gcnew String(request) + " / HTTP/1.1\r\nHost: ", stringServer, "\r\nConnection: Close\r\n\r\n");

String^ stringResponse;

array<Byte>^bytesSent = Encoding::ASCII->GetBytes(stringRequest);

array<Byte>^bytesReceived = gcnew array<Byte>(256);

Socket^ s = ConnectSocket(stringServer, port);

if (s == nullptr)

{

stringResponse = "Connection failed";

}

s->Send(bytesSent, bytesSent->Length, static_cast<SocketFlags>(0));

int bytes = 0;

do

{

bytes = s->Receive(bytesReceived, bytesReceived->Length, static_cast<SocketFlags>(0));

stringResponse = String::Concat(stringResponse, Encoding::ASCII->GetString(bytesReceived, 0, bytes));

}

while (bytes > 0);

array<String^>^ arrayResponse = stringResponse->Split('\n');

IntPtr ptr = Marshal::StringToHGlobalAnsi(arrayResponse[arrayResponse->Length - 1]);

return (char*)ptr.ToPointer();

}

Подскажите, где затаилась ошибка????

 

для начала откатите терминал на 225 релиз

 
пробовал. результат тот же самый :(((
 

Тут похоже --

if (s == nullptr)

{

response = "Connection failed";

}

Сделай респонс целым числом и передавай код.

Да, и кто будет чистить память, которая выделяется под возвращаемый текст?

 
Обязательно с сокетами работать? Почему бы не передавать данные по http? Таких примеров в кодебазе навалом.
 

Всем спасибо за советы. Учел. Что касается сокетов, то ошибка возникала в случае, когда его не удалось создать. Простой try catch помог решить эту проблему :)

Причина обращения: