Функции для работы с графиком и реестром windows(DLL)

 

1. Здрасте.. вот ищу функцию, которая возвращает является ли график(подокно терминала) активным. Функция, естественно вызавается из MQL программы... может в стандартной Win32 есть, или, может кто подскажет..

2. Еще ищу для работы с реестром, запись, чтение и тд... (ну тут, думаю пояснять не стоит... Мог бы конечно и сам порыться, но раз уж на форум пришлось идти - заодно)

Заранее благодарю)

 

1. Библиотека.

 // 4.2.10. Функция возвращает наличие активности окна графика по его системному дескриптору. В случае успеха функция возвращает TRUE, иначе - FALSE.
 bool ServiceIsChartActive(int hwndChart); // Системный дескриптор контроллируемого окна графика.
2. На форуме было что-то такое. Надо поискать.
 
Zhunko:

1. Библиотека.

......

Вадим, как впечатление от новых билдов? В библиотеке много править придётся?

Радует то, что скорость нового кода куда выше. Но юникод, конечно, придётся конвертировать (чтоб старые DLL не поправлять).

--

Можно сохранить практически все старые наработки, сделав перекодировочные намордники на DLL-функции. Я пробовал, перекодируется всё за микросекунды, всё летает (учитывая что сам mql-код исполняется быстрей).

принцип прмерно такой:

#import "SoftFX.OneClickTrading.dll"

// Creates instance of FDK information provider;
// Returns provider guid;
// accountServer - string;
// input value - should contain the result of AccountServer() function; 

//  Fix for bild 536
//int FdkCreate(int &isServerAllowed[], string accountServer, string terminalCompany, string accountCompany); //  ЭТО СТАРАЯ ФУНКЦИЯ. С ANSI-СТРОКАМИ
int FdkCreate(int &isServerAllowed[], uchar &accountServer[], uchar &terminalCompany[], uchar &accountCompany[]);  // ЭТО Я ЕЁ ПЕРЕОПРЕДЕЛИЛ

// Deletes instance of FDK information provider;
// handle - int;
// input value - should contain the result of FdkCreate function;
void FdkDelete(int handle);

// Subscribes to FDK level2;
// handle - int;
// input value - should contain the result of FdkCreate function;
// symbol - string;
// input value - should contain Symbol name in "CCY1CCY2" format; 
// depth - int;
// input value - should contain a level2 depth to subscribe;

//  Fix for bild 536
// void FdkSubscribe(int handle, string symbol, int depth);                         И  ТАК  ЖЕ  ПОСТУПАЮ  СО  ВСЕМИ ФУНКЦИЯМИ  ГДЕ  ЕСТЬ ANSI-СТРОКИ  В ПАРАМЕТРАХ
void FdkSubscribe(int handle, uchar &symbol[], int depth);

// Unsubscribes to FDK level2;
// handle - int;
// input value - should contain the result of FdkCreate function;
// symbol - string;
// input value - should contain Symbol name in "CCY1CCY2" format; 

//  Fix for bild 536
// void FdkUnsubscribe(int handle, string symbol);
void FdkUnsubscribe(int handle, uchar &symbol[]);
......................................
.................
..........
#import

а потом ниже по коду их перегружаю :

int FdkCreate(int &isServerAllowed[], string accountServer, string terminalCompany, string accountCompany)  //  Вуаля.  Теперь из вызывающего кода будет вызываться именно эта функция,
{                                                                                                           //  которая сначала перекодирует строки, а потом уже вызовет старую DLL-функцию
  uchar aS[], tC[], aC[];
  StringToCharArray(accountServer,aS);
  StringToCharArray(terminalCompany,tC);                         /////////   здесь перекодировка (однотипная)  из юникода в ansi
  StringToCharArray(accountCompany,aC);                          /////////   она не сложная и везде одинаковая
  return FdkCreate(isServerAllowed, aS, tC, aC);   // а это вызов функции из DLL              
}                                                                /////////   код получается вполне рабочий.  данную DLL с этим самым намордником юзаю без проблем.

void FdkSubscribe(int handle, string symbol, int depth)
{
  uchar temp[];
  StringToCharArray(symbol,temp);
  FdkSubscribe(handle, temp, depth);
}
void FdkUnsubscribe(int handle, string symbol)
{
  uchar temp[];
  StringToCharArray(symbol,temp);
  FdkUnsubscribe(handle, temp);
}

/////////////////////////////////////  И  т.д.   и  т.п.

void FdkGetQuotes(int handle, string symbol, int &SizeBids[], double &Bids[], double &BidVols[], int &SizeAsks[], double &Asks[], double &AskVols[])
{
  uchar temp[];
  StringToCharArray(symbol,temp);
  FdkGetQuotes(handle, temp, SizeBids, Bids, BidVols, SizeAsks, Asks, AskVols);
}
void FdkGetBidQuotes(int handle, string symbol, int &SizeBids[], double &Bids[], double &BidVols[])
{
  uchar temp[];
  StringToCharArray(symbol,temp);
  FdkGetBidQuotes(handle, temp, SizeBids, Bids, BidVols);
}

в результате вызывающий код вообще НЕ НУЖДАЕТСЯ НИ В КАКОЙ МОДИФИКАЦИИ.

ПРОСТО КОМПИЛИРУЕТСЯ И РАБОТАЕТ БЫСТРЕЕ ЧЕМ РАНЬШЕ (поскольку сам выполняемый mql-код ускорился)

 
Evgeno:

2. для работы с реестром

advapi32.dll
 

Нашел функцию:

#import "user32.dll"
int      GetParent(int h);
int      GetTopWindow(int h);
int      GetAncestor(int,int);
int      GetDlgItem(int,int);
int      SendMessageA(int,int,int,int);
#import

bool fIsWindowActive(){
   int tWH=WindowHandle(Symbol(),Period());
   int tTWnd=GetAncestor(tWH,2);
   int hMDICWnd=GetDlgItem(tTWnd,0xE900);
   int hMDIAWnd=SendMessageA(hMDICWnd,0x0229,0,0);
   int tWH2=GetDlgItem(hMDIAWnd, 0xE900);
   return(tWH==tWH2);
}
 
Integer:

Нашел функцию:


а можешь пояснить по строчно? + константы (у них ведь есть дефайн имена из winapi ?)
 
sergeev:

а можешь пояснить по строчно? + константы (у них ведь есть дефайн имена из winapi ?)


Бинго!
 
Integer:

Бинго!

в смысле ты нашел код но не полностью знаешь его функционал?

----

чего я спрашиваю - думаю что пора бы сделать ветку, посвященную WInApi + Terminal.

и чтоб не копаться в MSDN по этим константам - надеялся на твой быстрый ответ.

 
sergeev:

1. в смысле ты нашел код но не полностью знаешь его функционал?

----

чего я спрашиваю - думаю что пора бы сделать ветку, посвященную WInApi + Terminal.

и чтоб не копаться в MSDN по этим константам - надеялся на твой быстрый ответ.



1. Да.

Все что на этом форуме сделано по этой теме сделано Ильнуром. Если какие вариации и были, то только после него и на основе его кода.

И еще у меня нет желания становиться мастером WIN API, слишком обширная тема. Если какие задачи возникают, решаются непосредственно по мере их возникновения (и тут же забываютя).

 
MetaDriver:

Вадим, как впечатление от новых билдов? В библиотеке много править придётся?

Радует то, что скорость нового кода куда выше. Но юникод, конечно, придётся конвертировать (чтоб старые DLL не поправлять).

--

Можно сохранить практически все старые наработки, сделав перекодировочные намордники на DLL-функции. Я пробовал, перекодируется всё за микросекунды, всё летает (учитывая что сам mql-код исполняется быстрей).

принцип прмерно такой:

а потом ниже по коду их перегружаю :

в результате вызывающий код вообще НЕ НУЖДАЕТСЯ НИ В КАКОЙ МОДИФИКАЦИИ.

ПРОСТО КОМПИЛИРУЕТСЯ И РАБОТАЕТ БЫСТРЕЕ ЧЕМ РАНЬШЕ (поскольку сам выполняемый mql-код ускорился)

Владимир, меня напрягает высокомерное отношение к пользователем. Остальное - ерунда. Справимся :-)

В библиотеках надо будет исправить передачу строковых массивов. И то, не знаю пока, надо ли. Метаквоты так и не объяснили, как им удалось запретить передачу массивов структур их строк :-)) Теперь, ведь, структуры будут.

Подожду релиза. Тогда буду исправлять. Сейчас свою оболочку (приложение, форма) для тестов советника пишу. Так надёжнее и быстрее. Универсальность не нужна. Только СА. А то, достали уже языками разными, глюками старыми и новыми. Вместо работы постоянные бета-тесты МТ4 :-)

Кстати, форма почему-то с каждым днём всё больше похожа на МТ4 :-))

С переходом на юникод проблем не вижу. Все функции со строками у меня в трёх экземплярах:

1. Текущая кодировка проекта. Для проектов С++.

2. ANSI для МТ4.

3. UNICODE для МТ5. Теперь можно будет в МТ4 использовать.

При этом кодировка самого проекта произвольная. Конечно, для юникода лучше в юникоде компилировать. Чтобы все символы можно было использовать.

Использую преобразование кодировки строковых параметров и возвращаемых значений:

1. Текущая кодировка проекта -> текущая кодировка проекта.

2. ANSI -> текущая кодировка проекта.

3. UNICODE -> текущая кодировка проекта.

Получается всё независимо. Т.е. в перспективе надо будет только инклюд исправить. "A" на "W" поменять.

 

1) если это надо для управления (обработка событий мыши), то я использую такую конструкцию :

//+------------------------------------------------------------------+
#import "user32.dll"
   int   WindowFromPoint(int x,int y);
   bool  GetCursorPos(int& Pos[2]);
#import
//+------------------------------------------------------------------+
bool IsActive(){int cursor[2];
   GetCursorPos(cursor);
   return(WindowHandle(Symbol(),Period()) == WindowFromPoint(cursor[0],cursor[1]));
}
//+------------------------------------------------------------------+

если курсор над искомым окном - оно считается активным.

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