Передача указателя на функцию 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 #:

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

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

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