Скачать MetaTrader 5

Передача строки в dll (Delphi)

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Добавили поддержку испанского языка. Заходи и изучай!
Debugger
2501
Debugger 2010.02.13 11:51 

Всем доброго времени суток!!!

Сам некоторое время мучался с подобной проблемой.

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

И так...

Из MQL строку передаем стандартно, а вот в dll на Delphi принимаем следующим образом.


function FunctionName(const PassString: PChar): какой-то тип данных;

var

StrBuff: ShortString;

begin

StrBuff:=ShortString(PassString); 

//далее можно извращаться и делать с этой строкой все что заблагорассудится

//делаем свои дела с StrBuff

end;





igor
1144
igor 2010.02.13 12:14  

Можно и так:

var

StrBuff:String;

begin

StrBuff:=pchar(PassString);

Работает тоже стабильно.

harbor
121
harbor 2013.02.08 14:52  

как в mql4 получить строку из dll ?

 я делаю через массивы int Test(double& aa[], int& bb[], string& val[]);

так вот double и int нормально получаю, а string упирается ни в какую не хочет

 Test(aa, bb, val); // делаю обращение к dll 

   Symb=val[0];  // должны получить

   lot=aa[0];

   oper=bb[0]; 

Alexey Subbotin
4998
Alexey Subbotin 2013.02.08 16:43  
вы хотите получить строку или массив строк?
harbor
121
harbor 2013.02.09 12:45  

по идее мне надо передать в dll массив строк, а возвращать достаточно только одну

возвращать строку получается через результат функции, то есть  если писать описать string Test(double& aa[], int& bb[], string& val[]);

и в скрипте получать результат выполнения, тогда работает

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

Debugger
2501
Debugger 2013.02.09 17:44  
Проблему решил кардинально, просто стал писать на C++
harbor
121
harbor 2013.02.11 09:24  

ДА мне осталось чуть чуть доделать, переходить на си++ уже не охота.

Вобщем у меня строки передаются, но как-то странно через одну, то есть должны передаться шесть строк(я ими заполняю combobox), а передаются всего три, каждая через пустую

 

код простой, в dll из скрипта  передается массив из 6 строк val[] и этими строками должен заполнится combobox

и как я уже сказал, он заполняется, но вставляет зачем то пустую строку после каждой строки, откуда берется пустая строка, не понимаю

 

хотя точнее сказать передаются 12 строк, я сделал цикл до 11 и получил все свои строки из скрипта, но они почему-то чередуются пустыми

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

 

  Form1.combobox1.Clear;
   i:=5;
   for k := 0 to i do
   Form1.ComboBox1.Items.Add(val[k]);

   Form1.comboBox1.ItemIndex:=0;
Комбинатор
15932
Комбинатор 2013.02.11 09:29  

Смотрите пример dllSample.

Строка в массиве передается как структура, в сэмпле есть ее описание.

harbor
121
harbor 2013.02.11 11:01  

мм, смотрел но не совсем понял

 попробовал передать  массив описанный как string strarray[6]={ "first", "second", "third", "fourth", "fifth" };

все равно тоже самое, наверное просто буду удалять пустые строки

проблема наверное гдето в дельфях, что-то там лишнее считывается видимо

Debugger
2501
Debugger 2013.02.11 11:06  
harbor:

мм, смотрел но не совсем понял

 попробовал передать  массив описанный как string strarray[6]={ "first", "second", "third", "fourth", "fifth" };

все равно тоже самое, наверное просто буду удалять пустые строки

проблема наверное гдето в дельфях, что-то там лишнее считывается видимо


В свое время тоже бился над этой проблемой, решил ее криво, но суть заключалась в передаче массива символов

harbor
121
harbor 2013.02.11 12:10  

понятно, сделал в общем перед добавлением в combobox проверку на пустую строку, и в общем-то добился чего хотел..

но цикл надо делать в два раза больше, то есть для 6 передаваемых строк надо 12 раз обрабатывать 

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий