Передача указателя на функцию mql5 в dll.

 

Есть ли какая то возможность передать в dll callback функцию?

Что то вроде:

std::function<bool(wchar_t* some_string)> callback;

extern "C" __declspec(dllexport) void __stdcall set_callback(std::function<bool(wchar_t* some_string)> handle)
{
  callback = handle;
}

void some_alert_fuction()
{
  callback(L"Called from DLL.");
}

 
DrSky:

Есть ли какая то возможность передать в dll callback функцию?

Что то вроде:

коротко: НЕТ

 
Maxim Kuznetsov #:

коротко: НЕТ

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

 
DrSky #:

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

Так-то, можно адрес функции в рантайме достать попробовать, только надо еще определить какое соглашение для вызовов используется, что бы в dll ее правильно вызвать.

 
Vladimir Simakov #:

Так-то, можно адрес функции в рантайме достать попробовать, только надо еще определить какое соглашение для вызовов используется, что бы в dll ее правильно вызвать.

в ран-тайме у слишком многих функций не будет адреса. При агрессивной оптимизации они инлайнятся. 

 
Maxim Kuznetsov #:

в ран-тайме у слишком многих функций не будет адреса. При агрессивной оптимизации они инлайнятся. 

Ну да, есть такой момент))) Как вариант, можно с нею так поступить:

void __CallBack(){
   static bool firstCall=true;
   if(firstCall){
      firstCall=false;
      return;
   }
   //TODO
}

typedef void(*TCallBack)(void);

long GetPtr(TCallBack callBack){
   DLLFoo_DetectPtr();
   callBack();
   return DLLFoo_GetPtr();
}

void OnStart()
  {
   TCallBack CallBack =__CallBack;
   long ptrCallBack=GetPtr(CallBack);
   //TODO
    }

Тут у компилятора нет оснований инлайнить.

 
Vladimir Simakov #:

Ну да, есть такой момент))) Как вариант, можно с нею так поступить:

Тут у компилятора нет оснований инлайнить.

тут как раз велик шанс что заинлайнится вообще всё, развернётся "в одну простынку". 

 

Возможно ли сюда подставить адрес MQL5-функции?

EnumPropsEx(hwndSubclass, WinPropProc, NULL); 

Описанная WinAPI-функция вызывает нужное количество раз другую функцию по ее адресу. Надо, чтобы она вызывала MQL5-функцию. Это возможно?


В winuser.mqh данная WinAPI-функция имеет такую сигнатуру.

int                                 EnumPropsExW(HANDLE wnd,PVOID enum_func,PVOID param);
Выделенный входной параметр - long-адрес на функцию, который и нужно получить.
Использование свойств окна - Win32 apps
Использование свойств окна - Win32 apps
  • Karl-Bridge-Microsoft
  • learn.microsoft.com
В этом разделе объясняется, как выполнять следующие задачи, связанные со свойствами окна.
 
fxsaber #:

Возможно ли сюда подставить адрес MQL5-функции?

Описанная WinAPI-функция вызывает нужное количество раз другую функцию по ее адресу. Надо, чтобы она вызывала MQL5-функцию. Это возможно?

Нет.

Единственный способ - писать свою DLL, в которой, описать этот коллбэк и подцепить через вызов WinAPI-функции.