Какие данные ? какой API ? какая dll ? ... а то получается: Когда еду на жигулях проблемы часто, а когда на мэрсе - не часто но тоже бывают... Помогите люди добрые...
Проблем с доступом из разных потоков к одной dll быть неможет (если она не криптованая), вероятнее всего экземпяры пытаютя получить монопольный доступ к одному и тому-же ресурсу системы. Без исходника и бутылки - никак не разобраться...
Какие данные ? какой API ? какая dll ? ... а то получается: Когда еду на жигулях проблемы часто, а когда на мэрсе - не часто но тоже бывают... Помогите люди добрые...
function get_data():PChar; stdcall;
var h: integer;
s: string;
begin
CoInitialize(nil);
h := FindWindowEx(FindWindow(nil,'P'),0,'TGroupBox',nil);
h := FindWindowEx(h,0,'TEdit',nil);
SetLength(s, SendMessage(h, WM_GETTEXTLENGTH, 0, 0)+1);
SendMessage(h, WM_GETTEXT, length(s), Integer(PChar(s)));
Result:=PChar(s);
if h=0 then Result:='Хендл не найден';
CoUnInitialize;
end;
Классное сравнение, надо записать :)
А обрабатывать ошибки - это не модно ? проверка h==0 в конце кода - оригинальный шаг, а функции его использующие нехай сами пурхуются.
Эммм.... какие ошибки? На отсутствие хендла? Терминал падает и без этой проверки, а хендл есть или нет - все работает одинаково, просто если хендл не находится функция возвращает ноль. в принципе все работает на одном графике на ура, проблема именно в одновременном использовании DLL-ки несколькими графиками.
... а попробуй выходить из фунции если h==0 (и окошка и TEdit), не вызывая всего остального.
function get_data():PChar; stdcall;
var h: integer;
s: string;
begin
CoInitialize(nil);
h := FindWindowEx(FindWindow(nil,'Primary'),0,'TGroupBox',nil);
if h=0 then exit;
h := FindWindowEx(h,0,'TEdit',nil);
if h=0 then exit;
SetLength(s, SendMessage(h, WM_GETTEXTLENGTH, 0, 0)+1);
SendMessage(h, WM_GETTEXT, length(s), Integer(PChar(s)));
Result:=PChar(s);
CoUnInitialize;
end;
Все равно падает. Причем хендл всегда есть - куда ж ему деваться-то. Самое забавное, выскакивает окно смерти, а за ним видно что советник спокойно работает дальше - данные получает без проблем. А с одним графиком все летает... Даже никаких задержек не надо...
Все, нашел ошибку! Вернее нашел мудрую статейку:
"Проблема в том, что dll используется одновременно дважды (к примеру) одним приложением, когда в одном месте dll используется и в другом месте её пытаются выгрузить из памяти, вэтот момент в первом вызове происходит ошибка.
Счетчик организовать очень просто, делать его надо в приложении которое вызывает dll.
Объявляете переменную Count типа Integer, присваиваете ей значение 0.
В функции загрузки dll после выполненной успешно загрузки дописываете строчку Inc(Count).
В функции выгрузки dll из памяти дописываете строчку Dec(Count) - перед выгрузкой из памяти. и после этого смотрите если значение Count=0, то больше dll нигде не используется и её можно выгружать, если счетчик больше 0, то это значит что dll где то используется и выгружать её не стоит, это сделает последний процесс который будет с ней работать.
Грубо говоря текущее значение счетчика содержит количество текущих использований dll."
ВСЕ ПАШЕТ!!!!! УРА!!!!!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Уважаемые знатоки, подскажите пожалуйста, написал простенькую DLL, для импорта в советника внешних данных черех API.
Если советник используется для одной пары, то все работает ОК. Но если для нескольких - иногда терминал падает, выскакивает "Извините за ошибку" и все такое. Т.Е. очевидно, что проблема с общим доступом к одной DLL. советник работает в цикле, я увеличил задержку интераций (через Sleep) до секунды, ошибка стала возникать ГОРАЗДО реже, но возникает все равно... В чем может быть дело??