Адрес переменной в MQL4 - страница 2

 

Программа упала вот в этой функции GetExitCodeProcess .
Ты её используешь? Видимо то что она возвращает ты записываешь в lpExitCode.

 

Если вы хотите передать что-либо в длл по ссылке (чтобы обратно получить изменённым), используйте для этих целей массивы.

Читайте доки, ибо это рулез. https://docs.mql4.com/ru/basis/variables/formal

 
А я смотрю на Access Addr : 00000000

Кода этой dll у меня нет. Задача вобщем-то простая - запустить приложение, после того как работа приложения будет завершена, продолжить работу скрипта. Эта dll должна такое делать. Я не знаю как сделать это самому((((
 
elritmo:

Через ссылку попробуй передают данные в длл из скрипта.

То есть если в длл
__declspec(dllexport) int _stdcall func1(double& d) {
...
}

то в скрипте можно передать так
double dVar;
func1(dVar);

При этом переменная dVar в длл может быть изменена и в скрипте будет новое значение.
Попробуй и расскажи что получилось :o)
Сам не пробовал, пока некогда, но думаю, что так будет работать.


Не совсем, правильно

func1(double *d){
..........................
в данном случае d будет желаемым адресом. Для получения значения нужно будет указатель разименовать :

double c = *d;
double C = d[0];

что одно и то же

Успехов.
 
Если надо передать адрес переменной, то используйте массив
#import  "bgexec.dll"
   bool ExecCmd(string lpCmdLine, int& lpExitCode[], int dwTimeOut, bool bTerminate); 
#import
int start()
{
   int RetCode[1];
   bool rv=ExecCmd("C:\\Program Files\\Winamp\\winamp.exe",RetCode,-1,false); 
   return(0);
}
В RetCode[0] вызываемой функцией будет записано новое значение
 
stringo писал (а):
Если надо передать адрес переменной, то используйте массив
#import  "bgexec.dll"
   bool ExecCmd(string lpCmdLine, int& lpExitCode[], int dwTimeOut, bool bTerminate); 
#import
int start()
{
   int RetCode[1];
   bool rv=ExecCmd("C:\\Program Files\\Winamp\\winamp.exe",RetCode,-1,false); 
   return(0);
}
В RetCode[0] вызываемой функцией будет записано новое значение


С этим такое дело:

There has been a critical error
Time : 2006.11.17 16:06
Program : Client Terminal
Version : 4.00 (build: 198, 19 Oct 2006)
Owner : MetaQuotes Software Corp. (MetaTrader)
OS : Windows XP Professional 5. 1 Service Pack 2 (Build 2600)
Processors : 1, type 586, level 15
Memory : 97776/15092 kb
Exception : C0000005
Address : 00000052
Access Type : read
Access Addr : 00000052

Registers : EAX=00000000 CS=001b EIP=00000052 EFLGS=00010246
: EBX=FFFFFFFF SS=0023 ESP=01D0FF2C EBP=01D0FF64
: ECX=00E65E48 DS=0023 ESI=01039780 FS=003b
: EDX=0000002F ES=0023 EDI=0104BBC4 GS=0000

Stack Trace : 0045131C 7C80B50B 00000000 00000000
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000
Modules :
1 : 00400000 00298000 D:\Program Files\MetaTrader - Test\terminal. exe
2 : 01D10000 00008000 D:\Program Files\MetaTrader - Test\experts\libraries\bgexec. dll
3 : 10000000 0000A000 C:\PROGRA~1\MYWEBS~1\bar\1. bin\mwsoestb. dll
4 : 20000000 002CD000 C:\WINDOWS\system32\xpsp2res. dll
5 : 5B260000 00038000 C:\WINDOWS\system32\UxTheme. dll
6 : 61EC0000 0000E000 C:\WINDOWS\system32\MFC42LOC. DLL
7 : 71A80000 00008000 C:\WINDOWS\system32\WS2HELP. dll
8 : 71A90000 00017000 C:\WINDOWS\system32\WS2_32. dll
9 : 73D90000 000FE000 C:\WINDOWS\system32\MFC42. DLL
10 : 746E0000 0004B000 C:\WINDOWS\system32\MSCTF. dll
11 : 76350000 00005000 C:\WINDOWS\system32\MSIMG32. dll
12 : 76380000 00049000 C:\WINDOWS\system32\comdlg32. dll
13 : 76B20000 0002E000 C:\WINDOWS\system32\WINMM. dll
14 : 77110000 0008C000 C:\WINDOWS\system32\OLEAUT32. dll
15 : 773C0000 00102000 C:\WINDOWS\WinSxS\X86_Microsoft. Windows. Common-Controls_6595b64144ccf1df_6. 0.2600.2180_x-ww_a84f1ff9\COMCTL32.dll
16 : 774D0000 0013C000 C:\WINDOWS\system32\ole32. dll
17 : 77BF0000 00008000 C:\WINDOWS\system32\VERSION. dll
18 : 77C00000 00058000 C:\WINDOWS\system32\msvcrt. dll
19 : 77D30000 00090000 C:\WINDOWS\system32\USER32. dll
20 : 77DC0000 000AC000 C:\WINDOWS\system32\ADVAPI32. dll
21 : 77E70000 00091000 C:\WINDOWS\system32\RPCRT4. dll
22 : 77F10000 00046000 C:\WINDOWS\system32\GDI32. dll
23 : 77F60000 00076000 C:\WINDOWS\system32\SHLWAPI. dll
24 : 7C800000 000F6000 C:\WINDOWS\system32\kernel32. dll
25 : 7C900000 000B1000 C:\WINDOWS\system32\ntdll. dll
26 : 7C9C0000 00818000 C:\WINDOWS\system32\SHELL32. dll

Call stack :
004511F0:012C [0045131C] ?SetInputVar@CExpertInterior
7C80B357:01B4 [7C80B50B] GetModuleFileNameA [C:\WINDOWS\system32\kernel32. dll]

 
А в скрипте можно объявить Эту переменную так:
int RetCode[1]={0};
 А у тебя видтимо вот так int RetCode[]; или int RetCode;
 
elritmo писал (а):
А в скрипте можно объявить Эту переменную так:
int RetCode[1]={0};
А у тебя видтимо вот так int RetCode[]; или int RetCode;
Если так то тоже падает, но вместо адреса 52, адрес 20726564
 

Вы уверены, что эта dll соответствует нашему соглашению о связях?

 
Вот пример получения целой структуры
//+------------------------------------------------------------------+
//|                                                    LocalTime.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/"
 
#import "kernel32.dll"
void GetLocalTime(int& TimeArray[]);
void GetSystemTime(int& TimeArray[]);
int  GetTimeZoneInformation(int& TZInfoArray[]);
#import
 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
   int    TimeArray[4];
   int    TZInfoArray[43];
   int    nYear,nMonth,nDay,nHour,nMin,nSec,nMilliSec;
   string sMilliSec;
//----
   GetSystemTime(TimeArray);
//---- parse date and time from array
   nYear=TimeArray[0]&0x0000FFFF;
   nMonth=TimeArray[0]>>16;
   nDay=TimeArray[1]>>16;
   nHour=TimeArray[2]&0x0000FFFF;
   nMin=TimeArray[2]>>16;
   nSec=TimeArray[3]&0x0000FFFF;
//---- format date and time items
   string time_string=FormatDateTime(nYear,nMonth,nDay,nHour,nMin,nSec);
   Print("System time is: ",time_string);
//----
   GetLocalTime(TimeArray);
//---- parse date and time from array
   nYear=TimeArray[0]&0x0000FFFF;
   nMonth=TimeArray[0]>>16;
   nDay=TimeArray[1]>>16;
   nHour=TimeArray[2]&0x0000FFFF;
   nMin=TimeArray[2]>>16;
   nSec=TimeArray[3]&0x0000FFFF;
   nMilliSec=TimeArray[3]>>16;
//---- format date and time items
   sMilliSec=1000+nMilliSec;
   sMilliSec=StringSubstr(sMilliSec,1);
   time_string=FormatDateTime(nYear,nMonth,nDay,nHour,nMin,nSec);
   Print("Local time is: ",time_string,":",sMilliSec);
//---- shift with daylight savings
   int gmt_shift=0;
   int ret=GetTimeZoneInformation(TZInfoArray);
   if(ret!=0) gmt_shift=TZInfoArray[0];
   Print("Difference between your local time and GMT is: ",gmt_shift," minutes");
   if(ret==2) gmt_shift+=TZInfoArray[42];
   Print("Current difference between your local time and GMT is: ",gmt_shift," minutes");
//---- GMT
   datetime local_time=StrToTime(time_string);
   Print("Greenwich mean time is: ",TimeToStr(local_time+gmt_shift*60,TIME_DATE|TIME_SECONDS));
//---- winter time (nYear remains the current)
   nYear=TimeArray[17]&0x0000FFFF;
   nMonth=TZInfoArray[17]>>16;
   nDay=TZInfoArray[18]>>16;
   nHour=TZInfoArray[19]&0x0000FFFF;
   nMin=TZInfoArray[19]>>16;
   nSec=TZInfoArray[20]&0x0000FFFF;
   time_string=FormatDateTime(nYear,nMonth,nDay,nHour,nMin,nSec);
   Print("Standard time is: ",time_string);
//---- summer time (nYear remains the current)
   nYear=TimeArray[38]&0x0000FFFF;
   nMonth=TZInfoArray[38]>>16;
   nDay=TZInfoArray[39]>>16;
   nHour=TZInfoArray[40]&0x0000FFFF;
   nMin=TZInfoArray[40]>>16;
   nSec=TZInfoArray[41]&0x0000FFFF;
   time_string=FormatDateTime(nYear,nMonth,nDay,nHour,nMin,nSec);
   Print("Daylight savings time is: ",time_string);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string FormatDateTime(int nYear,int nMonth,int nDay,int nHour,int nMin,int nSec)
  {
   string sMonth,sDay,sHour,sMin,sSec;
//----
   sMonth=100+nMonth;
   sMonth=StringSubstr(sMonth,1);
   sDay=100+nDay;
   sDay=StringSubstr(sDay,1);
   sHour=100+nHour;
   sHour=StringSubstr(sHour,1);
   sMin=100+nMin;
   sMin=StringSubstr(sMin,1);
   sSec=100+nSec;
   sSec=StringSubstr(sSec,1);
//----
   return(StringConcatenate(nYear,".",sMonth,".",sDay," ",sHour,":",sMin,":",sSec));
  }
//+------------------------------------------------------------------+
Причина обращения: