Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как запретить запуск копии приложения? / 14 сообщений из 14, страница 1 из 1
13.12.2011, 16:22
    #37573303
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить запуск копии приложения?
Допустим есть приложение pro.exe
Одна его копия находится в папке "1", а вторая копия в папке "2".

Требуется запретить запуск приложения, если оно уже запущено, однако если запущено приложение с папки 1 то приложение с папки 2 должно запускаться, а две копии приложения с одной папки не должно запускаться.

Можно ли такое сделать программно?
...
Рейтинг: 0 / 0
13.12.2011, 16:23
    #37573310
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить запуск копии приложения?
mutex
...
Рейтинг: 0 / 0
13.12.2011, 16:35
    #37573356
BelowZero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить запуск копии приложения?
donpauls,

Код: vbnet
1.
If App.PrevInstance = True Then End
...
Рейтинг: 0 / 0
13.12.2011, 17:56
    #37573637
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить запуск копии приложения?
BelowZero,
donpaulsОдна его копия находится в папке "1", а вторая копия в папке "2".Ты проверил?
Еще один риторический вопрос.
...
Рейтинг: 0 / 0
13.12.2011, 18:08
    #37573689
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить запуск копии приложения?
AntonariyBelowZero,
donpaulsОдна его копия находится в папке "1", а вторая копия в папке "2".Ты проверил?
Еще один риторический вопрос.

Почему, всё работает! Спасибо, BelowZero!
...
Рейтинг: 0 / 0
13.12.2011, 18:11
    #37573697
BelowZero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить запуск копии приложения?
AntonariyBelowZero,
donpaulsОдна его копия находится в папке "1", а вторая копия в папке "2".Ты проверил?
Еще один риторический вопрос.
да... уже год в каждой проге пользуюсь этой простой, но полезной строчкой. что-то не так?

Antonariy,
donpaulsесли запущено приложение с папки 1 то приложение с папки 2 должно запускаться, а две копии приложения с одной папки не должно запускаться а ты внимательно прочитал задание? AntonariyЕще один риторический вопрос.
...
Рейтинг: 0 / 0
13.12.2011, 20:46
    #37574061
Читай !
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить запуск копии приложения?
AntonariyBelowZero,
donpaulsОдна его копия находится в папке "1", а вторая копия в папке "2".Ты проверил?
Еще один риторический вопрос.
А что проверять то?
BelowZero опять срёт в форуме, забанить пора его.
...
Рейтинг: 0 / 0
13.12.2011, 20:54
    #37574067
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить запуск копии приложения?
AntonariyТы проверил?а что не так?
...
Рейтинг: 0 / 0
13.12.2011, 21:48
    #37574149
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить запуск копии приложения?
Перепутал с переименованием файла. При переименовании — не работает.
...
Рейтинг: 0 / 0
14.12.2011, 00:50
    #37574373
alex77755
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить запуск копии приложения?
В модуль:

Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
Option Explicit
Public Declare Function GetWindowText Lib "user32" _
Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
       
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

Public Declare Function FindWindow Lib "user32" _
        Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Public Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function SetWindowPlacement Lib "user32" (ByVal hWnd As Long, lpwndpl As WINDOWPLACEMENT) As Long
Public Declare Function GetWindowPlacement Lib "user32" (ByVal hWnd As Long, lpwndpl As WINDOWPLACEMENT) As Long
        
Private Const SW_SHOWMINIMIZED = 2
Private Const SW_SHOWNORMAL = 1

Private Type POINTAPI
  x As Long
  y As Long
End Type

Private Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type

Private Type WINDOWPLACEMENT
  Length As Long
  flags As Long
  showCmd As Long
  ptMinPosition As POINTAPI
  ptMaxPosition As POINTAPI
  rcNormalPosition As RECT
End Type

' Здесь будут лежать заголовки всех найденных окон
Dim strCaptions() As String
' А здесь все хэндлы этих окон
Dim lngHandle() As Long

' ***************************
' * StartUp процедура
' ****************************
Sub Main()

' Например заголовок окна "Form1"
  If RestorePrevInstance("Form1") Then
    ' Закрываем текущее приложение
    Exit Sub
  Else
    ' Нет запущенного приложения
    Form1.Show
  End If
End Sub

' *************************************************
' Проверяем запущена программа или нет.
' Если запущена, то делаем фокус на нее
' ********************************************************************
Public Function RestorePrevInstance(strCaption As String) As Boolean
    Dim iCount As Integer
    Dim i As Long
    Dim Pos As Integer
    Dim lngEnum As Long
    Dim udtCurrWin As WINDOWPLACEMENT
    Dim lngLenArray As Long
    
    ' Обнуляем  массив от возможных прошлых результатов
    ReDim strCaptions(0)
    ReDim lngHandle(0) ' то же чистим
    
    ' вот эта функция будет циклически вызвана столько раз,
    ' сколько будет найдено окон
    ' т.е. после ее выполнения оба массива будут наполнены
    lngEnum = EnumWindows(AddressOf Callback1_EnumWindows, 0)
    
    iCount = 0
    
    ' Получаем кол-во найденных окон
    lngLenArray = UBound(strCaptions)
    
    For i = 0 To lngLenArray
        ' перебираем эти массивы
        Pos = InStr(1, strCaptions(i), strCaption, vbTextCompare)
        ' ищем строку, которая должна характеризовать искомое окно
        If Pos > 0 Then
            udtCurrWin.Length = Len(udtCurrWin)
            Call GetWindowPlacement(lngHandle(i), udtCurrWin)
            
            If udtCurrWin.showCmd = SW_SHOWMINIMIZED Then
                udtCurrWin.Length = Len(udtCurrWin)
                udtCurrWin.flags = 0&
                udtCurrWin.showCmd = SW_SHOWNORMAL
                Call SetWindowPlacement(lngHandle(i), udtCurrWin)
            End If
            
            Call SetForegroundWindow(lngHandle(i))
            
            iCount = iCount + 1
        End If
    Next
    
    If iCount >= 1 Then
        RestorePrevInstance = True ' работа выпонена
    Else
        RestorePrevInstance = False 'такое окно не найдено
    End If
  
End Function

Public Function Callback1_EnumWindows(ByVal hWnd As Long, ByVal lpData As Long) As Long
    Dim cnt As Long
    Dim strTitle As String * 256
    
    cnt = GetWindowText(hWnd, strTitle, 255)
    ' ищем следующее окно
    
    If cnt > 0 Then ' нашли, тогда добавляем элемент в массивы
        ReDim Preserve lngHandle(UBound(strCaptions) + 1)
        ReDim Preserve strCaptions(UBound(strCaptions) + 1)
        strCaptions(UBound(strCaptions)) = Left$(strTitle, cnt)
        lngHandle(UBound(lngHandle)) = hWnd
    End If
   
    Callback1_EnumWindows = 1 ' продолжаем перебирать
End Function
...
Рейтинг: 0 / 0
14.12.2011, 00:52
    #37574376
alex77755
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить запуск копии приложения?
Будет только одна копия даже при переименовании
И при запуске из любых папок
...
Рейтинг: 0 / 0
14.12.2011, 11:32
    #37574848
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить запуск копии приложения?
> Автор: alex77755
> Будет только одна копия даже при переименовании
> И при запуске из любых папок

А на терминальном сервере проверял?


> Автор: Shocker.Pro
> > Antonariy
> > Ты проверил?
> а что не так?

Если вопрос касался App.PrevInstance, то я проверял много лет назад. Оно не работало. И в где-то в документации читал,
что это наследие 16-битной разрядности бейсика и в 6-й версии это имеет кучу ограничений, когда не работает. Проверить
сейчас не могу и собственно даже не хочу, т.к. считаю что правильно - использовать мьютек, семафор - что-то из объектов
синхронизации предоставляемых системой.

P.S. Или оно заработало?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.12.2011, 12:05
    #37574968
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить запуск копии приложения?
Я непредвзято проверил - работает так, как в задаче автора. Винда XP, VB с SP6
Просто не знал, что раньше это не работало )
...
Рейтинг: 0 / 0
14.12.2011, 14:30
    #37575409
alex77755
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить запуск копии приложения?
>>>Игорь Горбонос
>>>А на терминальном сервере проверял?
Я и слов таких не слышал
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как запретить запуск копии приложения? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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