Скачать MetaTrader 5

Проблема с WinUser32 - страница 3

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
ПавелИванович
541
ПавелИванович  
Meat:

1. Вообще-то имя функции не lstrcat, а lstrcatA (либо lstrcatW).

2. Но использование конкатенации строк для того чтобы получить адрес переменной - это очень не рациональный способ. Я бы даже сказал, очень глупый способ. Во-первых, тратятся ресурсы на выполнение ненужной операции. Во-вторых, надо всегда следить, чтобы размер выделенной памяти для первой строки был достаточным для вмещения обеих строк (нуль-терминатных). В противном случае огребёшь проблем.

3. Я использую для этих целей функцию int CharPrevA(string lpszStart,string lpszCurrent) из библиотеки "user32.dll". В обоих параметрах указываешь одну и ту же строковую переменную, и на выходе получаешь адрес этой переменной: address=CharPrevA(mystring,mystring);

1. Не надо умничать! Хотите сказать, что как написано у меня работать не будет? Не найдет функцию lstrcat ? А вы, вообще, пробовали исполнять мои скрипты ? Или вы просто "теоретик" ?

2. Чтобы не выглядеть глупым не пишите больше таких вещей. Во-первых, эти фразы - еще одно доказательство, что вы брякнули "чисто теоретически", не глядя в исходники моих скриптов и не зная "как же там эта функция используется". Во-вторых, никаких ресурсов не тратится вовсе. Функция получает такие параметры, при которых ей нечего делать.

3. А вот это единственная полезная информация из вашего сообщения. CharPrev - действительно подходящая для такого "приведения типов" функция.

.

Справедливости ради хочу написать также, что lstrcat все же немного более "тяжелая" функция. Она использует код инициализации обработчика исключений и все же пытается выполнить хоть какую-то работу, прежде чем выясняется, что делать нечего. Функция CharPrev - легче и дает реальный выигрыш - 30-50 тактов процессора - десятки наносекунд.

Alexey Navoykov
4239
Alexey Navoykov  
api:

1. Не надо умничать! Хотите сказать, что как написано у меня работать не будет? Не найдет функцию lstrcat ? А вы, вообще, пробовали исполнять мои скрипты ? Или вы просто "теоретик" ?

2. Чтобы не выглядеть глупым не пишите больше таких вещей. Во-первых, эти фразы - еще одно доказательство, что вы брякнули "чисто теоретически", не глядя в исходники моих скриптов и не зная "как же там эта функция используется". Во-вторых, никаких ресурсов не тратится вовсе. Функция получает такие параметры, при которых ей нечего делать.

3. А вот это единственная полезная информация из вашего сообщения. CharPrev - действительно подходящая для такого "приведения типов" функция.

.

Справедливости ради хочу написать также, что lstrcat все же немного более "тяжелая" функция. Она использует код инициализации обработчика исключений и все же пытается выполнить хоть какую-то работу, прежде чем выясняется, что делать нечего. Функция CharPrev - легче и дает реальный выигрыш - 30-50 тактов процессора - десятки наносекунд.

Вы ведёте себя как обиженный ребёнок. Я разве переходил на личности? Высказывал что-то конкретно в ваш адрес? Я высказал конструктивную критику предложенного вами способа и не более. Поэтому впредь потрудитесь следить за языком и не переходить на личности.

Насчёт того что функция lstrcat не будет работать без постфикса A или W - в этом я ошибся, признаю. Но это не суть.

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

А вот что касается ваших скриптов, вы упомянули только названия файлов. А сами то файлы где? Мы не телепаты. Так откуда нам знать, какие вы там параметры передаёте в функцию?

Могу предположить, что вы в качестве одного из параметров вы передаёте пустую строку или неициализированную. Так? Неужели трудно было просто сказать об этом? Зачем ссылаться на какие-то скрипты? Ведь речь идёт всего об 1-2 строчках кода.

А по поводу скорости работы вашего варианта, вы делали какие-то замеры или просто чисто теоретически предполагаете? Попробуйте передать туда строку длиной скажем 500 Мб. Какова будет скорость исполения? Ведь функции придётся просканировать 500 Мб памяти, в поисках нуля. Или если вторая строка нулевой длины, то сканирования не будет?

Andrew
28
Andrew  
jartmailru:
В общем... если у функции стоит аргумент int, то это означает, что туда "войдет":
- int, стандартная ширина 4 байта
- любой массив- т.к. он передается адресом- т.е. передается 4-байтовый указатель
- строка, т.к. она опять же передается указателем
Вопрос в том, что указателя в мокле нет, а потребность передавать в SendMessage
как int, так и string / массивы- есть.


указатель на строку можно получить, закинув в dll (см. pointer.dll) функцию (в "переводе" на MQL) вида

int StrPtr(int stri);

а в экспорте описать ее

int StrPtr(string stri);
По поводу передачи массива - не нашел в справочнике нужное место с описанием, но, наверное, тем же самым способом можно получить и его указатель.
Файлы:
pointer_1.zip 47 kb
ПавелИванович
541
ПавелИванович  
Meat:

Вы ведёте себя как обиженный ребёнок.

...

Так откуда нам знать, какие вы там параметры передаёте в функцию?


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

Вы в чей-нибудь профиль хоть раз заглядывали?

Алексей Тарабанов
7328
Алексей Тарабанов  

О как!

А что у нас с профилем?

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