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

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

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

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

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

Antonariy,
donpaulsесли запущено приложение с папки 1 то приложение с папки 2 должно запускаться, а две копии приложения с одной папки не должно запускаться а ты внимательно прочитал задание? AntonariyЕще один риторический вопрос.
...
Рейтинг: 0 / 0
Как запретить запуск копии приложения?
    #37574061
Читай !
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonariyBelowZero,
donpaulsОдна его копия находится в папке "1", а вторая копия в папке "2".Ты проверил?
Еще один риторический вопрос.
А что проверять то?
BelowZero опять срёт в форуме, забанить пора его.
...
Рейтинг: 0 / 0
Как запретить запуск копии приложения?
    #37574067
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyТы проверил?а что не так?
...
Рейтинг: 0 / 0
Как запретить запуск копии приложения?
    #37574149
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перепутал с переименованием файла. При переименовании — не работает.
...
Рейтинг: 0 / 0
Как запретить запуск копии приложения?
    #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
Как запретить запуск копии приложения?
    #37574376
Фотография alex77755
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будет только одна копия даже при переименовании
И при запуске из любых папок
...
Рейтинг: 0 / 0
Как запретить запуск копии приложения?
    #37574848
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: alex77755
> Будет только одна копия даже при переименовании
> И при запуске из любых папок

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


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

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

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

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


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