Как программно получить логи наименьшими усилиями? - страница 3

 

А зачем там класс, позвольте спросить?  Достаточно лишь несложной функции.

алгоримт использует много памяти как динамической, так и выделяемой от VirtualAllocEx.
Ну может не очень и много, но зачем 100 а то и 1000 раз делать лишнюю работу, если можно все сделать в конструкторе одинажды (такой себе RAII получается).

 
Sergey Dzyublik:

алгоримт использует много памяти как динамической, так и выделяемой от VirtualAllocEx.
Ну может не очень и много, но зачем 100 а то и 1000 раз делать лишнюю работу, если можно все сделать в конструкторе одинажды (такой себе RAII получается).

Да откуда там много памяти то?  Выделить статический буфер под текст достаточно только в самом начале.  А потом, если понадобится, увеличить его.

Вот отыскал свой код со старого MQL4.  Там многие вещи через танцы с бубном приходилось делать.  Сейчас всё проще конечно.

#include <WinUser32.mqh> #import "user32.dll"   int CharPrevA(string lpszStart,string lpszCurrent); // используем для получения адреса строки   int CharPrevW(int lpszStart[],int lpszCurrent[]); // используем для получения адреса массива целых чисел string GetListViewItemText(int hlistview, int item, int subitem=0) {     #define LVM_GETITEMTEXT  4141   static string txtbuf[1] = {"                                                                                                                               "}; // буфер 128 байт int textaddress= GetAddressOfStr(txtbuf, 0);   if (textaddress==0) { Alert("text address =0"); return(0); }   static int LVITEM[10];  ArrayInitialize(LVITEM, 0);   LVITEM[0]=0xFFFF;      // Mask   LVITEM[1]=item;        // Item   LVITEM[2]=subitem;     // iSubItem   LVITEM[5]=textaddress; // textbuffer   LVITEM[6]=128;         // TextMask   int LVITEM_addr= GetAddressOfInt(LVITEM);   if (LVITEM_addr==0) { Alert("LVITEM address =0"); return(0); }      if (SendMessageA(hlistview, LVM_GETITEMTEXT, item, LVITEM_addr) >0)     return(txtbuf[0]);   return(""); } //+------------------------------------------------------------------+ int GetAddressOfStr(string str[], int index=0)  // Получение адреса строки {   return(CharPrevA(str[index],str[index])); } //--------------------------------- int GetAddressOfInt(int array[], int index=0)  // Получение адреса массива целых чисел {   return(CharPrevW(array,array)+index*4); }   

 

Спасибо всем за обсуждение!

Для решения моей задачи хватило отправки команды на открытие папки с логами (инициирующей сброс логов на диск).

Спасибо Ильнуру за исследования и код:

#property copyright "Copyright 2015, Ilnur Iksanov"
#property link      "https://www.mql5.com/ru/users/ilnur"
#property version   "1.00"
#property strict

#import "user32.dll"
   int PostMessageA(int hWnd, int Msg, int wParam, int lParam);
   int GetAncestor(int hWnd, int gaFlags);
#import

#define GA_ROOT           2
#define WM_COMMAND        0x0111

void OnStart()
{
   // В качестве wParam можно передавать следующие коды:
   // 33101 - Открыть (Журнал),       35435 - Открыть (Эксперты)
   // 33117 - Просмотр (Журнал),      33118 - Просмотр (Эксперты)
   // 35448 - Копировать (Журнал),    35449 - Копировать (Эксперты)
   // 33120 - Очистить (Журнал),      33121 - Очистить (Эксперты)
   SendCommand( 33101 );
}

void SendCommand( int wParam )
{
   // получаем системный дескриптор основного окна терминала
   int hMetaTrader = GetAncestor(WindowHandle(Symbol(), Period()), GA_ROOT);

   if (hMetaTrader > 0)
   {
      PostMessageA(hMetaTrader, WM_COMMAND, wParam, 0);
   }
}
Причина обращения: