Нужна помощь!!! Не получается передать строку через DLL, во внешнюю программу.

 

Здравствуйте, Уважаемые форумчане!

Нужна помощь!!! Не получается передать строку через DLL, во внешнюю программу.

Проблема в следующем: в Дельфи создал ДЛЛ, которая через SendMessage передает строку (тип String) во внешнюю прогу.

В експерте, описываю вызов процедуры:

#import "C:\Program Files\Borland\Delphi7\Projects\DLL\sendmsg.dll"
       int SendText(string tr,string rty1);
#import

Теперь передаем строку в другую прогу:

string e1="13;CHF/USD;01.01.2001;03.03.2003;777**************8;";
SendText("Form2",e1);

При этом все работает нормально, и строка передается в окно Form2 (написано на Дельфи), и обрабатывается.

НО, ЕСЛИ ПРОИЗВЕСТИ ОБЪЕДИНЕНИЕ СТРОК ПЕРЕД ПЕРЕДАЧЕЙ:

string e1=StringConcatenate("USD","EUR");
SendText("Form2",e1); 

Терминал выдает сообщение о критической ошибке и закрывается.

Подскажите что нужно сделать, что исправить.

Если объединенную строку передавать между приложениями написанными на Дельфи, все работает превосходно, объединенная строка передается и обрабатывается в окне Form2.

 
Может попробывать переложить объединённую строку в буфер?
string sBuf10 = "          ";
string e1=StringConcatenate("USD","EUR");
sBuf10 = e1;
SendText("Form2",e1);
 
Билд терминала какой?
 

Через буфер не помогло, критическая ошибка.

 

БИЛД = 226.

 
Zoro:

Через буфер не помогло, критическая ошибка.

 

БИЛД = 226.


  Поставьте билд 225 - тут уже обсуждалось, что в 226-м билде идёт не правильное распределение памяти. И переименуйте файл LiveUpdate.exe во что-нибудь иное, например в LiveUpdate123.exe - это чтоб терминал не доставал Вас своими попытками обновиться.
 
Zoro:

Через буфер не помогло, критическая ошибка.

Особо не надеялся... Библиотека обращается в чужую память. В отладчике можно посмотреть.
 

Билд 225, не помог в решении проблемы.

Обращаюсь к разработчикам.   Как можно решить эту проблему или посоветуйте другой способ передать строку из Експерта в стороннее приложение. 

 
Реализуй передачу не строки, а массив ASCII кодов этой строки. В DLL необходимо осуществить выделение памяти под этот динамический массив, и произвести обратное преобразование ASCII кодов в строку, вот собственно и все.
 
Я всегда пересылал из DLL (делфи) в MQL строку текста как PChar. Вроде и string работает, но не совсем корректно. Ну и если string, не забываем про его длину.
 
В С++ проблем с передачей не было. В основном проблемы с приёмом. Почему-то иногда указатель на строковый буфер MQL4 обнуляется. И конечно, происходит после этого аварийная выгрузка терминала.
 
Kos:
Реализуй передачу не строки, а массив ASCII кодов этой строки. В DLL необходимо осуществить выделение памяти под этот динамический массив, и произвести обратное преобразование ASCII кодов в строку, вот собственно и все.



Т.е. передавать массив целых чисел (Integer) ASCII кодов?

Но в MQL нет функции преобразования символа в ASCII код.

 

Вот код ДЛЛ:

procedure SendText(hwnd:PChar; Content: String); Stdcall;
var
     cd: TCopyDataStruct;
     hw:integer;
begin
    cd.cbData := Length(Content) + 1;
    cd.lpData := PChar(Content);
        hw:=FindWindow(hwnd, nil);
        SendMessage(hw, WM_COPYDATA, 0, LParam(@cd));
end;

 Может попробовать передавать текст не как String, а как Pchar, по совету zhuki, буду пробовать...

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