Передача структуры в dll C++ - страница 3

 
есть рабочий пример для связки Pipes МТ5 <=> C# : https://github.com/artemiusgreat/metatrader-tester
возможно поможет, там тоже структуры возюкаются
был пример МТ5 <=> С++ CLI <=> C# для DLL, но он мне показался громоздким и я его схе*ачил :)
 

Благодарю всех за помощь. Не успел прочитать ваши ответы, в итоге сделал все через передачу char массивами с заранее известными разделителями. 

#import "Test_dll.dll"
void Cpp_OnInit(char &inputData[]);

bool Cpp_callRobot(const char &quotes[],char &orders[],int &orderSize,char &Msg_from_robot[],int &MsgSize);

void Cpp_OnDeinit();
#import

а в dll уже все перебираю и выделяю нужное. Довольно хорошо получилось, однако опять же вопрос по стыковке. Когда я пытаюсь подключиться к Dll из тестового скрипта, скрипт вылетает когда доходит до первой же функции (Cpp_OnInit).

Сама dll к которой я подключаюсь, содержит в себе только алгоритм (или же тестовый пример как в текущем варианте, дабы не утомлять Вас ненуюжыми реализациями, приведу только хедры) :

 Test.h

#pragma once
#include"..\CppMql5_2\DataManager.h"
#include"..\CppMql5_2\Logger.h"
#include "..\CppMql5_2\StringManager.h"

struct Robot_InputData
{
        int asset_id_ToWrite;
        int tF;
        std::vector<int> lotArr;
        std::vector<double> priceArr;
        std::vector<double> SL_preceArr;
        std::vector<double> TP_preceArr;
        std::vector<int> asset_id_OrderArr;
        int orders_size;
};


// 1#1#1;2;0;#0.0;12823.0;0.0;#31738.0;0.0;31730.0;#0.0;29319.0;28205.0;#0;1;2;#3#
class CTest : public IRobot
{
public:
        CTest(char * inputData);
        // Inherited via IRobot
        virtual void callRobot(Quotes_keeper * data) override;

private:
        Logger::CLogger logger;
        Robot_InputData inputData;
        CStringManager stringManager;

        std::string getSymbName(int asset_id);
        std::string getTF(TF tF);

        void writeStr(Quotes_data *qData, std::vector<QuotesItem>::iterator &it);

};


Эта dll включает в себя .lib библиотеку где организовано само подключение если в вкратце то она состоит из сделующего:

enum class TF

enum class TickFlags

struct QuotesItem

class Quotes_data

struct OrderData

class Quotes_keeper

__interface IRobot
{
public:
        virtual void callRobot(Quotes_keeper *data);
};

IRobot * instanceRobot(char * inputData); // этот метод реализуется не в .lib файле а в самой dll и вызывается в .lib файле в функции _TO_MQL_ void Cpp_OnInit(char *inputData); что является указателем на робота

#define _TO_MQL_ extern "C" __declspec(dllexport)

_TO_MQL_ void Cpp_OnInit(char *inputData);

_TO_MQL_ bool Cpp_callRobot(const char * quotes, char * orders,int *orderSize, char * Msg_from_robot,int *MsgSize);

_TO_MQL_ void Cpp_OnDeinit();


Пытаюсь наладить такую вот стыковку:

Робота пишу на С++, далее присоединяю .lib файл, через него подключаюсь к MT5...


Сама библиотека .lib работает исправно дебагил и не раз (через консольное приложение)

dll пример тоже проверен и вся связка работает,  однако когда подключаюсь из Mql то вылетает следующее:


Однако функция там точно есть (тянется из .lib файла) Я так же пытался вставить в dll хедр и реализацию экспортируемых функций, однако ошибка та же...

Есть подозрение что с зависимостями не все ладно:



однако как добавить нужные (красные) не совсем пойму, не знаю сигнатуры некоторых функций, к примеру пытался из kernel32 добавить запрашиваемую функцию, однако не получилась с типами данных связать

Подскажите кто в курсе как их добавить ? или же в чем еще может быть загвоздка ?


Dll библиотека (тестовая моя) которую пытаюсь запустить в релиз скомпил, и соответственно дебаг ссылок не каких не содержит уже...  

Так же касательно зависимостей есть подозрение что дело не в них а где то еще (так как когда я компилил пример для теста работы с текстом, то он запустился без проблем, однако тоже имел некоторые красные зависимости.)

 
AndreyKrivcov:
  

Так же касательно зависимостей есть подозрение что дело не в них а где то еще (так как когда я компилил пример для теста работы с текстом, то он запустился без проблем, однако тоже имел некоторые красные зависимости.)

Попробуйте build 1646 там то точно все работало. Похожая ошибка как появилась после обновления - так и осталась до сих пор

https://www.mql5.com/ru/forum/1111/page2103#comment_6159407

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.12.05
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
AndreyKrivcov:

Благодарю всех за помощь. Не успел прочитать ваши ответы, в итоге сделал все через передачу char массивами с заранее известными разделителями. 

а в dll уже все перебираю и выделяю нужное. Довольно хорошо получилось, однако опять же вопрос по стыковке. Когда я пытаюсь подключиться к Dll из тестового скрипта, скрипт вылетает когда доходит до первой же функции (Cpp_OnInit).

Сама dll к которой я подключаюсь, содержит в себе только алгоритм (или же тестовый пример как в текущем варианте, дабы не утомлять Вас ненуюжыми реализациями, приведу только хедры) :

 Test.h


Эта dll включает в себя .lib библиотеку где организовано само подключение если в вкратце то она состоит из сделующего:


Пытаюсь наладить такую вот стыковку:

Робота пишу на С++, далее присоединяю .lib файл, через него подключаюсь к MT5...


Сама библиотека .lib работает исправно дебагил и не раз (через консольное приложение)

dll пример тоже проверен и вся связка работает,  однако когда подключаюсь из Mql то вылетает следующее:


Однако функция там точно есть (тянется из .lib файла) Я так же пытался вставить в dll хедр и реализацию экспортируемых функций, однако ошибка та же...

Есть подозрение что с зависимостями не все ладно:



однако как добавить нужные (красные) не совсем пойму, не знаю сигнатуры некоторых функций, к примеру пытался из kernel32 добавить запрашиваемую функцию, однако не получилась с типами данных связать

Подскажите кто в курсе как их добавить ? или же в чем еще может быть загвоздка ?


Dll библиотека (тестовая моя) которую пытаюсь запустить в релиз скомпил, и соответственно дебаг ссылок не каких не содержит уже...  

Так же касательно зависимостей есть подозрение что дело не в них а где то еще (так как когда я компилил пример для теста работы с текстом, то он запустился без проблем, однако тоже имел некоторые красные зависимости.)

Сделайте def - файл такого содержания:

EXPORTS
  Cpp_OnInit
  Cpp_callRobot
  Cpp_OnDeinit
 

1. скачай эту прогу http://www.nirsoft.net/utils/dll_export_viewer.html
2. открой свою DLL в ней
3. посмотри как компилятор обозвал твои методы, иногда может добавить подчеркивание

ошибка про unresolved function call еще иногда бывает когда неправильно указал порядок параметров функции, например, stdcall вместо cdecl, сейчас полного примера нет, но вот простой вызов, который точно работал

#pragma once

#define DEBUG 1

typedef wchar_t * strings;
typedef unsigned char * chars;

#define ECI extern "C" __declspec(dllexport) int __cdecl
#define ECV extern "C" __declspec(dllexport) void __cdecl
#define ECB extern "C" __declspec(dllexport) chars __cdecl
#define ECS extern "C" __declspec(dllexport) strings __cdecl
#define ECD extern "C" __declspec(dllexport) double __cdecl
/*
using namespace System;
using namespace System::Text;
using namespace System::Windows::Forms;
using namespace System::Collections::Generic;
using namespace System::Runtime::InteropServices;
using namespace Libs;
using namespace Libs::Pools;
using namespace Libs::Models;
using namespace Libs::Helpers;
using namespace Libs::Managers;
using namespace Libs::Connectors;
//using namespace Presentation;
//using namespace Presentation::Control;

[STAThread]
int StartPresentation()
{
        //Application::EnableVisualStyles();
        //Application::SetCompatibleTextRenderingDefault(false);
        //Application::Run(gcnew Tools());
        return 0;
}
*/

/// <summary>
/// In case this application is build as DLL we need to have entry point for it
/// </summary>
int main(int argc)
{
        return argc;
}

ECI demo()
{
        Logs::Message("Hello world", DEBUG);
        return 1;
}
DLL Export Viewer - view exported functions list in Windows DLL
DLL Export Viewer - view exported functions list in Windows DLL
  • www.nirsoft.net
This utility displays the list of all exported functions and their virtual memory addresses for the specified DLL files. You can easily copy the memory address of the desired function, paste it into your debugger, and set a breakpoint for this memory address. When this function is called, the debugger will stop in the beginning of this...
 
AndreyKrivcov:

Благодарю всех за помощь. Не успел прочитать ваши ответы, в итоге сделал все через передачу char массивами с заранее известными разделителями. 

а в dll уже все перебираю и выделяю нужное. Довольно хорошо получилось, однако опять же вопрос по стыковке. Когда я пытаюсь подключиться к Dll из тестового скрипта, скрипт вылетает когда доходит до первой же функции (Cpp_OnInit).

Сама dll к которой я подключаюсь, содержит в себе только алгоритм (или же тестовый пример как в текущем варианте, дабы не утомлять Вас ненуюжыми реализациями, приведу только хедры) :

 Test.h


Эта dll включает в себя .lib библиотеку где организовано само подключение если в вкратце то она состоит из сделующего:


Пытаюсь наладить такую вот стыковку:

Робота пишу на С++, далее присоединяю .lib файл, через него подключаюсь к MT5...


Сама библиотека .lib работает исправно дебагил и не раз (через консольное приложение)

dll пример тоже проверен и вся связка работает,  однако когда подключаюсь из Mql то вылетает следующее:


Однако функция там точно есть (тянется из .lib файла) Я так же пытался вставить в dll хедр и реализацию экспортируемых функций, однако ошибка та же...

Есть подозрение что с зависимостями не все ладно:



однако как добавить нужные (красные) не совсем пойму, не знаю сигнатуры некоторых функций, к примеру пытался из kernel32 добавить запрашиваемую функцию, однако не получилась с типами данных связать

Подскажите кто в курсе как их добавить ? или же в чем еще может быть загвоздка ?


Dll библиотека (тестовая моя) которую пытаюсь запустить в релиз скомпил, и соответственно дебаг ссылок не каких не содержит уже...  

Так же касательно зависимостей есть подозрение что дело не в них а где то еще (так как когда я компилил пример для теста работы с текстом, то он запустился без проблем, однако тоже имел некоторые красные зависимости.)

у меня в для MT4 экспорт в хидерах прописывается вот так :

#ifdef DLL
#define MQL_EXPORT __declspec(dllexport)
#else
#define MQL_EXPORT
#endif

#define MQL_API(t) MQL_EXPORT t __stdcall

MQL_API(int) mySomeFunc1(); // к примеру

получается яснее - есть макрос MQL_API(type) обозначающий экспортируемую функцию, легко искать. Конечно *.def обязателен к применению. Библиотеки собираются с /MD это тоже важно. И все функции __stdcall - параметры передаются исключительно через стек.

тогда всё работает, вплоть до компиляции на лету https://www.mql5.com/ru/forum/224745/page2#comment_6387202

ATcl - интерпретатор Tcl для MT4
ATcl - интерпретатор Tcl для MT4
  • 2018.01.18
  • www.mql5.com
Праздники прошли плодотворно, и представляю на суд общественности ATcl - встроенный интерпретатор Tcl в MT4...
 
благодарю всех, помог def файл
 
Maxim Kuznetsov:
 

И все функции __stdcall - параметры передаются исключительно через стек.

в x64 большинство параметров передаются через регистры - поэтому и быстродействие выше

 
A100:

в x64 большинство параметров передаются через регистры - поэтому и быстродействие выше

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

и дальнейшей оптимизации в указанном направлении в MQL мешает отсутствие ключевого слова inline

https://www.mql5.com/ru/forum/1111/page2042#comment_5860752

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.10.05
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
AndreyKrivcov:
 помог def файл

А пример (для теста работы с текстом, который запустился без проблем) работал без него?

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