Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрет запуска нескольких копий mde / 8 сообщений из 8, страница 1 из 1
01.12.2016, 12:12
    #39358348
VeraK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрет запуска нескольких копий mde
Добрый день.
Возможно, плохо ищу, но никак не могу понять - возможно сделать, чтобы при открытии mde не запускались новые копии приложения, а открывалось уже открытое?
...
Рейтинг: 0 / 0
01.12.2016, 12:19
    #39358355
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрет запуска нескольких копий mde
...
Рейтинг: 0 / 0
05.12.2016, 21:46
    #39360898
VeraK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрет запуска нескольких копий mde
Спасибо!!
После дополнительного гугления, на XP заработал такой скрипт vbs:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Dim objService, objProcess, WshShell

Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
Set objProcess = objService.ExecQuery("SELECT * FROM Win32_Process WHERE NAME = 'MSACCESS.EXE'")
Set WshShell = CreateObject("Wscript.Shell")

If objProcess.Count = 0 Then
	WshShell.Run "MSACCESS.EXE ""D:\database\file.mde""", 3
Else
	WshShell.appactivate "windowname"
End If

Set objService = Nothing
Set objProcess = Nothing
Set WshShell = Nothing
...
Рейтинг: 0 / 0
06.12.2016, 11:06
    #39361074
Odess
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрет запуска нескольких копий mde
Некрасивое решение.
А если будет второе приложение, которое должно работать на этом компьютере?
Будет ли оно работать на сервере с несколькими пользователями?

Гораздо красивее использовать такой метод:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Application.CurrentProject.Properties.Add "AppTitle", "ИмяПриложения"
Application.RefreshTitleBar


CurrWnd = GetWindow(Access.Application.hWndAccessApp, GW_HWNDFIRST)
Do While CurrWnd <> 0
  Length = GetWindowTextLength(CurrWnd)
  ListItem = Space(Length + 1)
  Length = GetWindowText(CurrWnd, ListItem, Length + 1)
  If Length > 0 Then
    If ListItem = "ИмяПриложения" Then 
      par = par + 1
      If par > 1 Then
        MsgBox ("Приложение уже запущено!")
        DoCmd.Quit
      End If
    End If
  End If
  CurrWnd = GetWindow(CurrWnd, GW_HWNDNEXT)
  DoEvents
Loop
...
Рейтинг: 0 / 0
06.12.2016, 11:28
    #39361088
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрет запуска нескольких копий mde
OdessНекрасивое решение.
...
Гораздо красивее использовать такой метод:
На вкус и цвет все фломастеры разные.
©

ИМХО, я бы не сказал, что это решение красивее - оно другое.
...
Рейтинг: 0 / 0
06.12.2016, 11:37
    #39361091
Odess
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрет запуска нескольких копий mde
Мое (в переносном смысле) решение более практичное. А не в плане более "красивого" кода.
Не думаю, что запрет запуска MSACCESS в количестве 1 экземпляра на компьютере есть правильным.
Вере самой решать - какое применять.
...
Рейтинг: 0 / 0
06.12.2016, 16:56
    #39361385
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрет запуска нескольких копий mde
Odess, ТС подобрал подходящее ему решение, а запрет вообще второго процесса Access это частное решение, по ссылке запрет запуска именно конкретного файла.
...
Рейтинг: 0 / 0
06.12.2016, 18:28
    #39361449
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрет запуска нескольких копий mde
а я тут скрестил ссылку с батом и получился ещё вариант (bat файла), который мне нравится (главное чтоб взлетело):
- ловит не акцесс, а файл как по ссылке Панурга
- должен запускаться не только на ХР, а и на W10 (64)
- полный путь к акесу позволяет запустить в нужной версии офиса (тут заточено на 2003) в режиме рантайма, или прямо в самом рантайме и пофиг, что стоит еще и офис 2007, 2010 или 2013 или вообще все вместе...
Слабое место "namepril" - это имя приложения в диспетчере (первая вкладка), например под ХР если свернуто, то не разворачивается (нужно руками доставать), а если не свернуто, а закрыто другими окнами - то вперед выскакивает... но и так хорошо...
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Dim fs, sysdrv, MyFold, MyPril
Dim objService, objProcess, WshShell
Dim StrRun
MyFold="C:\folder\"            'путь к программе
MyPril="proga.mde"            'программа
'ищем не запущено ли уже...
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
Set objProcess = objService.ExecQuery("SELECT * FROM Win32_Process WHERE NAME = 'MSACCESS.EXE' AND CommandLine like '%" & MyPril & "%'")
Set WshShell = CreateObject("WScript.Shell")
If objProcess.Count = 0 Then
On Error Resume Next
'--- Попытка запустить на 32 разрядной ОС.
        StrRun = """"& sysdrv & "\Program Files\Microsoft Office\OFFICE11\MSACCESS.EXE"" /runtime """ & MyFold & MyPril & ""
	WshShell.Run(StrRun)
'--- Попытка запустить на 64 разрядной ОС.
        StrRun = """"& sysdrv & "\Program Files (x86)\Microsoft Office\OFFICE11\MSACCESS.EXE"" /runtime """ & MyFold & MyPril & ""
        WshShell.Run(StrRun)
Else
MsgBox "Программа  уже запущена на вашем компьютере!"
' имя приложения в диспетчере задач (если было свернуто - может и не развернуться)
	WshShell.Appactivate "namepril"
End If
Set objService = Nothing
Set objProcess = Nothing
Set fs = Nothing
Set WshShell = Nothing
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрет запуска нескольких копий mde / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]