Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2011, 21:23   #1
Guest666
 
Регистрация: 12.06.2011
Сообщений: 3
По умолчанию Контроль доступа к функции в dll

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

часть кода длл:

Код:
CRITICAL_SECTION critsect;

void main()
{
	InitializeCriticalSection(&critsect);
}

MOUSEDLL_API int MouseForAI() //эта фунция вызывается из приложений
{
	
   POINT			cur_posi = {0};
   RECT			rect_edit = {400, 220, 422, 333};
   POINT			point_null = {-1, -1};
   ::GetCursorPos(&cur_posi);
		TryEnterCriticalSection(&critsect); // если использовать EnterCriticalSection(&critsect) то длл компилируется нормально, но при обращении приложений к ней вылетает ошибка и все, а в таком варианте работает все так же как и без критических секций
	MouseClick(NULL, rect_edit, MouseLeft, 1, NULL, cur_posi);
                      LeaveCriticalSection(&critsect); 
	return (0);

}
как сделать чтоб выполнение фуннции MouseClick осуществлялось только после полного завершения ее предыдущего вызова?
Спасибо зарание за любую помощь
Guest666 вне форума Ответить с цитированием
Старый 12.06.2011, 21:37   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если несколько приложений то смотрите в сторону именованных объектов синхронизации
например события(event) или мютексы(mutex)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.06.2011, 23:50   #3
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Guest666, принцип вообщем верный, только ошибка в том что:
CRITICAL_SECTION critsect должна быть объявлена в .shared секции dll.
А то сейчас получается, что каждое из приложений инициализирует свою копию этой переменной.
EUGY вне форума Ответить с цитированием
Старый 20.06.2011, 21:57   #4
Guest666
 
Регистрация: 12.06.2011
Сообщений: 3
По умолчанию

с мьютексами совсем все запутанно, пробую евенты:

Код:
секция shared 
HANDLE hEventA = ::CreateEvent(NULL, FALSE, TRUE, _T("TestEventA")); 
...
перед критической секцией
 ::WaitForSingleObject(hEventA, INFINITE);
после
 ::SetEvent(hEventA);
но почему то когда второй поток вызывает MouseClick() , не срабатывает WaitForSingleObject и они начинают выполнятся одновременно, подскажите пожалуйста что не так ?

Последний раз редактировалось Guest666; 21.06.2011 в 20:46.
Guest666 вне форума Ответить с цитированием
Старый 24.06.2011, 11:07   #5
Guest666
 
Регистрация: 12.06.2011
Сообщений: 3
По умолчанию

вобщем после миллиона попыток всевозможных способов и комбинаций, все такие получилось сделать чтоб работало нормально:
HANDLE m_mutex;

m_mutex = CreateMutex(NULL, FALSE,"TestMUTEX");
WaitForSingleObject(m_mutex, INFINITE);
КРЕТИЧЕСКАЯ СЕКЦЯ
ReleaseMutex(m_mutex);

при этом я убрал m_mutex из расшаренной секции в длл (так не работало)
Guest666 вне форума Ответить с цитированием
Старый 25.06.2011, 03:11   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Какая-то каша из объектов ядра и критических секций.
Что-то лишнее. Рекомендую Джеффри Рихтера. Реально в тему.
http://www.delphilab.ru/files/book/Richter.zip
EUGY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Dll и функции Antistas Общие вопросы Delphi 16 08.02.2011 15:03
Вызов функции из DLL(C#) ZverSS88 Помощь студентам 0 25.11.2010 11:27
Вызов функции из dll-ки VVVadim Общие вопросы Delphi 2 28.04.2009 10:37
Функции binkw32.dll Volkogriz Общие вопросы Delphi 3 16.10.2007 11:46
DLL + Процедуры(не функции) LEKA Общие вопросы Delphi 1 02.05.2007 20:37