Получение строки из dll C# в metatrader 4

Категория: Metatrader
Опубликовано 07.06.2013 04:00

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

Первое, что нам нужно сделать, это создать в советнике строковую переменную и разметить ее. Разметить, в смысле присвоить ей значение кол-вом символов не менее необходимого для возврата, при этом под эту строку выделится необходимая память. Так как в mql4 строки ограничены длиной в 256 символов, то можно таким количеством и разметить.

string StringIO1 = "--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------1";

Тут еще важно понять вот что. Если вы собираетесь получать из длл сразу две строковые переменные, то при разметке присваивайте им разные значения, достаточно изменить один из символов. Зачем это нужно? Дело в том, что есть такое понятие, как интернирование строк. Используется для оптимизации и если в исходном коде присутстствуют два идентичных строковых литерала, то во время запуска программы память выделяется только под одну строку, и обоим вашим переменным присвоится ссылка на одну область памяти. Последствия: изменив строку 1 получим идентичные изменения в строке 2.

Импортируем функцию:

#import "MyDll.dll"
	void Foo(string);
#import

Вызываем и получаем результат:

void start()
{
	Foo(StringIO1);
	Print(StringIO1);
}

Код C#:

[System.Reflection.Obfuscation(Feature = "DllExport")]
public unsafe static void Foo(byte* str)
{
	byte[] bt = Encoding.GetEncoding(1251).GetBytes("Hello World");
        for (int j = 0; j < bt.Length; j++)
            str[j] = bt[j];
        str[bt.Length] = (byte)'x0';
}

Вот и все.