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

 

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

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

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

И так...

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


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

var

StrBuff: ShortString;

begin

StrBuff:=ShortString(PassString); 

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

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

end;





 

Можно и так:

var

StrBuff:String;

begin

StrBuff:=pchar(PassString);

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

 

как в 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]; 

 
вы хотите получить строку или массив строк?
 

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

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

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

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

 
Проблему решил кардинально, просто стал писать на C++
 

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

Вобщем у меня строки передаются, но как-то странно через одну, то есть должны передаться шесть строк(я ими заполняю 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;
 

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

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

 

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

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

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

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

 
harbor:

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

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

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

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


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

 

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

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

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