Форум: "WinAPI";
Текущий архив: 2008.08.24;
Скачать: [xml.tar.bz2];
ВнизНе освобождается мьютех, почему? Найти похожие ветки
← →
NX (2007-11-17 15:00) [0]Программа создает мъютех, но освободить его не может
RaiseLastWin32Error возвращает:
System Error. Code: 288.
Попытка освободить не принадлежащий процессу объект синхронизации.
Но мьютех создается то в этом роцессе и освобождается в там же, в чем причина?
← →
Kolan © (2007-11-17 15:04) [1]> Но мьютех создается то в этом роцессе и освобождается в
> там же, в чем причина?
Есть подозрение, что в коде программы…
← →
Leonid Troyanovsky © (2007-11-17 15:06) [2]
> NX (17.11.07 15:00)
> Но мьютех создается то в этом роцессе и освобождается в
> там же, в чем причина?
Как создается и освобождается.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2007-11-17 15:08) [3]
> Kolan © (17.11.07 15:04) [1]
> Есть подозрение, что в коде программы…
Возможно, что и в версии дельфи/ОС.
--
Regards, LVT.
← →
NX (2007-11-17 16:10) [4]Вот пример кинул:
var
Form1: TForm1;
HSvcMtx: THandle;
Const
SvcMutex = "Service mutex";
APPMutex = "Application mutex";
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
HSvcMtx:=CreateMutex(nil,false,SvcMutex);
Win32Check(HSvcMtx <> 0);
if GetLastError <> ERROR_ALREADY_EXISTS then
ShowMessage("Create = "+SvcMutex)
else ShowMessage("No Create = "+SvcMutex);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Win32Check(ReleaseMutex(HSvcMtx));
RaiseLastWin32Error;
end;
← →
Leonid Troyanovsky © (2007-11-17 16:18) [5]
> NX (17.11.07 16:10) [4]
> HSvcMtx:=CreateMutex(nil,false,SvcMutex);
> Win32Check(ReleaseMutex(HSvcMtx));
Ну, дык он создается незахваченным (false),
что ж тогда освобождать.
--
Regards, LVT.
← →
MBo © (2007-11-17 16:21) [6]Не видно захвата мьютекса, т.к. создается он свободным
HSvcMtx:=CreateMutex(nil,false,SvcMutex);
← →
NX (2007-11-17 16:25) [7]
> Ну, дык он создается незахваченным (false), что ж тогда
> освобождать.
В примере неправильно было, сорри, даже в положении истина он не освобождается. как делал: два приложения таких запустил в первом создал, освободил второе все равно не захватывает.
← →
Leonid Troyanovsky © (2007-11-17 16:38) [8]> NX (17.11.07 16:25) [7]
> В примере неправильно было, сорри, даже в положении истина
> он не освобождается. как делал: два приложения таких запустил
> в первом создал, освободил второе все равно не захватывает.
Если это, дейс-но, сервис и приложения, то, вероятно,
у приложения не хватает прав.
Попробуй создать с security descriptor не nil,
а открытым для всех.
--
Regards, LVT.
← →
NX (2007-11-17 17:04) [9]
> Leonid Troyanovsky © (17.11.07 16:38) [8]
Это простое приложение пока, но в сервисе это будет стоять в дальнейшем.
Что - то в обыкновенном примере (просто проект форма 2 батона) и не работает. Есть еще условие, что я работаю с правами "опытного пользователя", но запускал под администратором всеравно таже хрень происходить , версия: BDS 2006 трех дисковая (кракнутая). система WinXP SP2 Pro Corp. Ed. rus.
← →
Leonid Troyanovsky © (2007-11-17 17:07) [10]
> NX (17.11.07 17:04) [9]
> Что - то в обыкновенном примере (просто проект форма 2 батона)
> и не работает
Код - в студию.
--
Regards, LVT.
← →
NX (2007-11-17 17:12) [11]
> Leonid Troyanovsky © (17.11.07 17:07) [10]
Он уже в студии: NX (17.11.07 16:10) [4]
исправте только CreateMutex(nil,false,SvcMutex); на true
у меня этот код и есть не рабочий даже со значением true
← →
Leonid Troyanovsky © (2007-11-17 17:25) [12]
> NX (17.11.07 17:12) [11]
> исправте только CreateMutex(nil,false,SvcMutex); на true
RaiseLastWin32Error - лишний, а так
вполне себе работает.
--
Regards, LVT.
← →
NX (2007-11-17 18:59) [13]
> Leonid Troyanovsky © (17.11.07 17:25) [12]
> RaiseLastWin32Error
дык он там стоял, что бы понять суть роисходящего.
Вот это саме и не работает, хм......
← →
NX (2007-11-17 19:11) [14]ReleaseMutex(HSvcMtx)
его освобождает, но неудаляет, тогда все равильно, только я не правильно захватываю его.
как захватить уже созданный мютекс?
← →
Leonid Troyanovsky © (2007-11-17 19:18) [15]
> NX (17.11.07 19:11) [14]
> я не правильно захватываю его.
> как захватить уже созданный мютекс?
WaitForSingleObject, например.
--
Regards, LVT.
← →
NX (2007-11-17 19:31) [16]а как уничтожить? через CloseHandle()
← →
Leonid Troyanovsky © (2007-11-17 19:42) [17]
> NX (17.11.07 19:31) [16]
> а как уничтожить? через CloseHandle()
Уничтожает его ОС (как, собс-но, и создает),
при закрытии последнего удерживаемого хендла.
Либо при кончине потока, удерживавшего мьютекс.
--
Regards, LVT.
← →
NX (2007-11-17 20:31) [18]
> Leonid Troyanovsky © (17.11.07 19:42) [17]
убивается через CloseHandle() однако.
← →
Leonid Troyanovsky © (2007-11-17 20:39) [19]
> Leonid Troyanovsky © (17.11.07 19:42) [17]
> Либо при кончине потока, удерживавшего мьютекс.
Это относится к освобождению, sorry.
--
Regards, LVT.
← →
NX (2007-11-17 21:40) [20]Странная штука, когда в одном приложении использывается CloseHandle(),
то можно мютекс заново создать, но как только его поимеет другое приложение, то CloseHandle() уже не прокатывает, только через закрытие программы.
← →
Leonid Troyanovsky © (2007-11-17 21:59) [21]
> NX (17.11.07 21:40) [20]
Путанник.
Почитал бы уж что-нибудь, хотя бы msdn.
--
Regards, LVT.
← →
NX (2007-11-17 22:49) [22]
> Почитал бы уж что-нибудь, хотя бы msdn.
слушаюсь и повинуюсь... :-)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2008.08.24;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.049 c