Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заставить работать CreateFileMapping глобально 
:(
    Опции темы
Delphist
Дата 25.1.2008, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Для запуска одной копии программы я настарте делаю такую вещь:

Код

function CheckAppRun: integer;
var
  Map: THandle;  
begin
  Map := CreateFileMapping($FFFFFFFF, nil, PAGE_READONLY, 0, 32, '{DA2380A2-EEDD-438F-11F8-ADEE5F6B3638}');
  if Map = 0 then
    Result := -1
  else if GetLastError = ERROR_ALREADY_EXISTS then
    Result := 1 //прога уже запущена
  else
    Result := 0
end;


Прикол в том, что данные фишка перестает работать, если я делаю так: загружаюсь в WinXP под обычным пользователем запускаю свою прогу под текущим пользователем, а затем запускаю прогу от имени админа и в результате запускается вторая копия проги, как это предотвратить, т.е. заставить CreateFileMapping создавать глобальный handle, т.е. чтобы всегда моглы быть запущено не более одной копии программы.
Тот же самый вопрос и для OpenMutex. 
И еще один вопросик, каким лучше пользоваться способом CreateFileMapping или OpenMutex для запуска одной копии проги. 


Это сообщение отредактировал(а) Delphist - 25.1.2008, 16:06


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
MetalFan
Дата 25.1.2008, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



тебе уже ответили на другом форуме.
попробуй добавить к началу имени маппинга 'Global\'


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
bems
Дата 25.1.2008, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



проверь версию виндов и если она >=2000 тогда создавай с именем 'Global\{DA2380A2-EEDD-438F-11F8-ADEE5F6B3638}'

это необходимая часть. Если окажется недостаточным установи вместо nil реальную SECURITY_ATTRIBUTES в которой не нулевой lpSecurityDescriptor, для которого функцией SetSecurityDescriptorDacl поставь DACL равный nil. Это предоставит всем полный доступ к объекту.
Но если мне не изменяет память даже если нет доступа, а объект существует то GetLastError вернет ERROR_ALREADY_EXISTS и с правами можно не дергаться. Короче, проверь smile

Добавлено через 1 минуту и 43 секунды
Цитата(Delphist @  25.1.2008,  16:02 Найти цитируемый пост)
каким лучше пользоваться способом CreateFileMapping или OpenMutex для запуска одной копии 
суть одна и та же, но мютекс поменьше будет. А еще лучше наверное event.

Добавлено через 7 минут и 31 секунду
процедуру перелай так
Код

function CheckAppRun: integer;
var
  Map: THandle;  
begin
  SetLastError(0);
  Map := CreateFileMapping($FFFFFFFF, nil, PAGE_READONLY, 0, 32, 'Global\{DA2380A2-EEDD-438F-11F8-ADEE5F6B3638}');
  if GetLastError=ERROR_ALREADY_EXISTS 
     then begin
             Result:=1;
             if Map=0 then CloseHandle(Map);
             end
     else Result:=0;       
  end;



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Delphist
Дата 25.1.2008, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Цитата(MetalFan @  25.1.2008,  19:38 Найти цитируемый пост)
тебе уже ответили на другом форуме.
попробуй добавить к началу имени маппинга 'Global\' 

И на том же форуме я ответил, что не помагает.


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
MetalFan
Дата 25.1.2008, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



может попробовать выставить себе права SeCreateGlobalPrivilege

Добавлено через 3 минуты и 15 секунд
стоп.

Цитата(Delphist @  25.1.2008,  19:26 Найти цитируемый пост)
что не помагает. 

объясни точнее, что тебе надо добиться от файломаппинга???
чтобы он был доступен из разных сессий?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Delphist
Дата 25.1.2008, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Цитата(MetalFan @  25.1.2008,  20:43 Найти цитируемый пост)
объясни точнее, что тебе надо добиться от файломаппинга???
чтобы он был доступен из разных сессий? 

Мне нужно через файл маппинг сделать чтобы всегда запускалось не более одной копии проги. Это не получается сделать если прога запускается под разными пользователями


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
MetalFan
Дата 26.1.2008, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



понятно. и что с применением всех описанных ранее условий происходит?
что и в какой момент возвращает GetLastError?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Delphist
Дата 28.1.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Цитата(bems @  25.1.2008,  19:44 Найти цитируемый пост)
процедуру перелай так
код Pascal/Delphi
function CheckAppRun: integer;
var
  Map: THandle;  
begin
  SetLastError(0);
  Map := CreateFileMapping($FFFFFFFF, nil, PAGE_READONLY, 0, 32, 'Global\{DA2380A2-EEDD-438F-11F8-ADEE5F6B3638}');
  if GetLastError=ERROR_ALREADY_EXISTS 
     then begin
             Result:=1;
             if Map=0 then CloseHandle(Map);
             end
     else Result:=0;       
  end;

Не фига не работает.

Добавлено через 58 секунд
Цитата(MetalFan @  26.1.2008,  01:27 Найти цитируемый пост)
понятно. и что с применением всех описанных ранее условий происходит?
что и в какой момент возвращает GetLastError? 

GetLastError возворатит 0 при запуске второй копии проги от имени другого пользователя


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
EvilsInterrupt
Дата 30.1.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 1
Всего: 9



Код

var
  hMutex        : THandle;
  CannotRunMsg  : string;

function IsApplicationRun : Boolean;
begin
  Result := False;
  hMutex := CreateMutex(nil, True,
            PChar(AnsiReplaceText(Application.ExeName,'\','/')));
  if  GetLastError = ERROR_ALREADY_EXISTS then
      Result := True;
end;


Попробуй-ка, может чего интересного увидешь.
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0665 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.