Проблема с DLL, прошу помощи!

 

Уважаемые знатоки, подскажите пожалуйста, написал простенькую DLL, для импорта в советника внешних данных черех API.

Если советник используется для одной пары, то все работает ОК. Но если для нескольких - иногда терминал падает, выскакивает "Извините за ошибку" и все такое. Т.Е. очевидно, что проблема с общим доступом к одной DLL. советник работает в цикле, я увеличил задержку интераций (через Sleep) до секунды, ошибка стала возникать ГОРАЗДО реже, но возникает все равно... В чем может быть дело??

 

Какие данные ? какой API ? какая dll ? ... а то получается: Когда еду на жигулях проблемы часто, а когда на мэрсе - не часто но тоже бывают... Помогите люди добрые...

Проблем с доступом из разных потоков к одной dll быть неможет (если она не криптованая), вероятнее всего экземпяры пытаютя получить монопольный доступ к одному и тому-же ресурсу системы. Без исходника и бутылки - никак не разобраться...

 
JavaDev писал(а) >>

Какие данные ? какой 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 в конце кода - оригинальный шаг, а функции его использующие нехай сами пурхуются.
 
JavaDev писал(а) >>
А обрабатывать ошибки - это не модно ? проверка h==0 в конце кода - оригинальный шаг, а функции его использующие нехай сами пурхуются.

Эммм.... какие ошибки? На отсутствие хендла? Терминал падает и без этой проверки, а хендл есть или нет - все работает одинаково, просто если хендл не находится функция возвращает ноль. в принципе все работает на одном графике на ура, проблема именно в одновременном использовании DLL-ки несколькими графиками.

 
webkrilya писал(а) >>

Эммм.... какие ошибки? На отсутствие хендла? Терминал падает и без этой проверки...

... а попробуй выходить из фунции если h==0 (и окошка и TEdit), не вызывая всего остального.

 
JavaDev писал(а) >>

... а попробуй выходить из фунции если 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;

Все равно падает. Причем хендл всегда есть - куда ж ему деваться-то. Самое забавное, выскакивает окно смерти, а за ним видно что советник спокойно работает дальше - данные получает без проблем. А с одним графиком все летает... Даже никаких задержек не надо...

 
дай мыло.
 
JavaDev писал(а) >>
дай мыло

hankala@rambler.ru

skype webkrilya

 

Все, нашел ошибку! Вернее нашел мудрую статейку:

"Проблема в том, что dll используется одновременно дважды (к примеру) одним приложением, когда в одном месте dll используется и в другом месте её пытаются выгрузить из памяти, вэтот момент в первом вызове происходит ошибка.
Счетчик организовать очень просто, делать его надо в приложении которое вызывает dll.
Объявляете переменную Count типа Integer, присваиваете ей значение 0.
В функции загрузки dll после выполненной успешно загрузки дописываете строчку Inc(Count).
В функции выгрузки dll из памяти дописываете строчку Dec(Count) - перед выгрузкой из памяти. и после этого смотрите если значение Count=0, то больше dll нигде не используется и её можно выгружать, если счетчик больше 0, то это значит что dll где то используется и выгружать её не стоит, это сделает последний процесс который будет с ней работать.
Грубо говоря текущее значение счетчика содержит количество текущих использований dll."

ВСЕ ПАШЕТ!!!!! УРА!!!!!