по вопросу о long - можно, но это вообще не нужно, если вы используете int именно в качестве 4 байтовго приемника чего то там типа от массива чаров. (то есть передаете именно по указателю &).
как узнать -вот тут может http://forum.ixbt.com/topic.cgi?id=26:37968
по вопросу о long - можно, но это вообще не нужно, если вы используете int именно в качестве 4 байтовго приемника чего то там типа от массива чаров. (то есть передаете именно по указателю &).
как узнать -вот тут может http://forum.ixbt.com/topic.cgi?id=26:37968
День добрый. Не смотря на то, что статья была написана относительно давно, вопрос обмена данными с библиотечными dll и по сей день остается актуальным. Я сам недавно столкнулся с необходимостью реализации определенного функционала и у меня встал выбор: писать свою dll или все же попробовать воспользоваться библиотечными. Я сделал выбор в пользу вторых и естественно столкнулся со сложностью передачи структур и получения данных обратно. Прочитав данную статью я не совсем уловил некоторых моментов, которые по моему мнению являются весьма усложненными. В данной статье при передаче структуры во внешнюю среду предлагается использовать массив, как выделенную область памяти, в которую библиотечная функция положит результат, и который нам в дальнейшем необходимо преобразовать для дальнейшей работы. У меня очень мало опыта в этой области и возможно дальнейшие мои рассуждения покажутся дилетантскими, но все же выскажу свое мнение в надежде что умные люди меня поправят. Рассмотрим простой пример, указанный в старой статье https://www.mql5.com/ru/articles/1543
В той статье рассматривается вопрос поиска файлов средствами библиотечных dll. Там так же предлагается передавать указатель на массив нужного размера, а потом из этого массива извлекать нужные данные.
А что такое по сути структура? Это тот же самый участок памяти. Теперь попробуем изменить подход к передаче структур и получения данных:
// Объявляем дефайны типов данных #define DWORD int #define TCHAR short // Устанавливаем данный тип, так как будем работать с unicode #define MAX_PATH (260) // Объявляем структуру FILETIME struct FILETIME { DWORD dwLowDateTime; DWORD dwHighDateTime; }; // Объявляем структуру данных результатов поиска struct _WIN32_FIND_DATA { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; TCHAR cFileName[MAX_PATH]; TCHAR cAlternateFileName[14]; }; // Объявив типы данных мы копируем структуры WinAPI вообще без изменений // Импортируем библиотечную функцию #import "kernel32.dll" int FindFirstFileW(string path, _WIN32_FIND_DATA& answer); #import //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { // Создаем переменную с типом ранее созданной структуры _WIN32_FIND_DATA data; // Обращаемся к библиотечной функции, передавая указатель на нашу структуру, а по сути на выделенную память int handle = FindFirstFileW(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Experts\\*.mq5", data); if(handle!=-1) { // Просматриваем результат поиска, обращаясь к полям нашей структуры без дополнительного преобразования Print("Имя найденного файла: ", ShortArrayToString(data.cFileName)); Print("Временное имя найденного файла: ", ShortArrayToString(data.cAlternateFileName)); Print("Размер найденного файла: ", data.nFileSizeLow); } //--- return(INIT_SUCCEEDED); } //+-
- 2008.07.15
- MetaQuotes Software Corp.
- www.mql5.com
А что такое по сути структура? Это тот же самый участок памяти. Теперь попробуем изменить подход к передаче структур и получения данных:
Вставил ваш код правильно через редактор
Вставил ваш код правильно через редактор
Спасибо большое! Я пока не разобрался как тут правильно код оформлять. (((
Спасибо большое! Я пока не разобрался как тут правильно код оформлять. (((
Как вставить код.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Избавляемся от балласта самодельных DLL:
Если MQL5-программисту недостаточно функционала языка, он вынужден обращаться к дополнительным инструментам. Для этого приходится использовать другой язык программирования и создавать промежуточную DLL. В MQL5 имеется механизм представления разных типов данных с помощью структур и передачи их в API, но к сожалению, MQL5 не отвечает нам на вопрос о том, как вытянуть данные из принятого указателя. В данной статье мы поставим точку в этом вопросе и покажем простые механизмы обмена сложными типами данных и работе с ними.
Автор: Alex Sergeev