RE: Возврат строки из dll

 

Подобная тема уже была на форуме. Тем не менее не все с ней понятно.

Набрал простой пример импорта строки из dll в МТ4. Возвращает крякозяблы. Может кто подсказать где ошибка?

//
#import "test.dll"
string RetStr();
#import

//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
//----+
string S;
S= RetStr();
Alert(S);
//----
return(0);
}
//+------------------------------------------------------------------+

unit Unit1;

interface

function RetStr: PChar; stdcall;
exports
RetStr;

implementation

function RetStr: PChar;
begin
Result := 'Возврат строки';
end;

end.


 
Debugger >>:

Подобная тема уже была на форуме. Тем не менее не все с ней понятно.

Набрал простой пример импорта строки из dll в МТ4. Возвращает крякозяблы. Может кто подсказать где ошибка?




Вы возвращете указатель на Паскалевскую строку (PChar), но в МКЛ нет такого типа.

Тип string в МКЛ :

struct MqlStr
  {
   int               len;
   char             *string;
  };

если судить по примерам в МТ4, то есть возвращать нужно указатель на тип, подобный MqlStr


Успехов...

 

Если я правильно понял, то делать нужно так:

unit Unit1;

interface

type
MQLString = record
Len: Integer;
Str: PChar;
end;

function RetStr: MQLString; stdcall;
exports
RetStr;

implementation

function RetStr: MQLString;
var
Str: MQLString;
S: string;
begin
S:= 'Возврат строки';
Str.Len:= Length(S);
Str.Str:= PChar(S);
Result := Str;
end;

end.

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

 

https://forum.mql4.com/ru/4721/page3


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

 

Благодарю.

Попутный вопрос, а массив можно возвращать из dll?