Получение строк из dll - страница 5

 
Yuriy Asaulenko:

Угу, и данные поступают уже минимум на след тике, а по таймеру уже возможно и позднее. И, если работать со стаканом, ваша заявка повисает в воздухе.

Вы вообще о чём? Длл и многопоточность то тут при чём?

 
Stanislav Dray:

Какие данные? На каком ещё тике? С каким стаканом?? Вы вообще о чём? Длл и многопоточность то тут при чём?

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

 
Yuriy Asaulenko:

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

Вообщем разговор ни очём. Обращайтесь, если вы уйдёте дальше теории и вам нужно будет организовать колбеки,пустить потоки или вернуть строки :)

 
Stanislav Dray:

Вообщем разговор ни очём. Обращайтесь, если вы уйдёте дальше теории и вам нужно будет организовать колбеки,пустить потоки или вернуть строки :)

Уже все организовано.)) Чары в ДЛЛ, оттуда через ТСР-клиент в ЕХЕ-приложение. Из приложения тем-же путем обратно.

Кого такая организация системы заинтересует, могу дать часть исходников. Stanislav Dray это не надо, ему это ни о чем.))

 
1. Всю тему не читал, поэтому может туплю, но... используй Memory Mapped Files. 
Я использовал этот класс в C# + была прокладка на C++ 
https://www.codeproject.com/Articles/138290/Programming-Memory-Mapped-Files-with-the-NET-Frame 
Для передачи данных из unmanaged MT5 в managed .NET, как выглядела прослойка уже точно не помню, по-моему просто копирование куска памяти 
https://stackoverflow.com/questions/30064439/passing-data-from-unmanaged-code-to-managed-code
Можно было создать MMF размером на 5 Мб и при передаче строки вторым параметром передавать ее размер, хотя, если строки заканчиваются на \0, то они должны правильно обрезаться в МТ

2. Теперь же, если используется сразу C# DLL, то никакой конверсии не надо, C# string = MT5 string 
https://www.mql5.com/ru/forum/285631/page3#comment_9157792 

3. Вот пример передачи через Pipes, там и структуры кое-как работали  
https://github.com/artemiusgreat/metatrader-tester 
 
Alexander Dubovik:

Пишу dll, из которой надо перегонять строки в MQL (NULL-terminated ANSI).

Понятно, что существует способ в стиле WinAPI: в один запрос спросить у dll требуемую длину строки, потом подготовить приёмный буфер достаточной длины, и во второй запрос попросить dll скопировать строку в этот буфер.

Но:

- очень уж кривенький способ - изящество отсутствует напрочь;

Этот способ не кривенький, а вполне нормальный.

Хотите изящный, напишите свой класс DLLString, использующий для выделения памяти для строки, системные функции GlobalAlloc(), GlobalFree().

И Вы сможете свободно передавать его в функции и возвращать из функций.

 

Как-то от темы сильно отклонились.

Для бОльшей ясности: система у меня построена и работает уже несколько лет. Но изредка крошится (обычно при закрытии терминала). Сейчас я её переписываю и покрываю тестами.


Обнаружил, что MQL жрёт следующее:

void* Test() {return NULL;};
void* test = Test();
Может void* можно сконвертировать в указатель на массив чаров?
 
Alexander Dubovik:

Не зло - это сказать компилятору MQL, чтобы он принял из dll указатель, и отдать этот указатель в CharArrayToString.

а вы понимаете что у массива тоже есть внутреннее представление?

Alexander Dubovik:
Может void* можно сконвертировать в указатель на массив чаров?

memcpy с нужной сигнатурой

 
TheXpert:

а вы понимаете что у массива тоже есть внутреннее представление?

Хм. В самом деле.

Стремление к изяществу упёрлось в очередной забор... Похоже, окончательно...

 
TheXpert:

memcpy с нужной сигнатурой

memcpy не подходит, т.к. его в MQL нет. А на стороне dll у меня и так руки развязаны...