Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Startup, проверка на его присутствие! Добавлено: 15.11.09 13:26  

Автор вопроса:  Millenium | Web-сайт: www.aliyev.us | ICQ: 629966 
Доброе время суток!
Столкнулся с небольшой проблемкой.
Создана клиентская программа которая при запуске добавляется себя в системный реестр для запуска вместе с системой. И может запускаться всего 1 копия!
Так проблема в том что, на некоторых машинах, при каждом запуске, программа как-то добавляет себя в авто запуск есчё раз. Надо проверить ключ в реестре на присутствие записи, если моя запись есть, то ничего не делать, если нету, то добавлять. Вот суть в том что, добавление и удаление ключа из реестра я знаю как делать и всё работает. Но как проверить присутствие ключа в реестра?
А-то пользователю постоянно выходит надпись, "Одна копия программы уже запущено!". И ето естественно их раздражает, а они звонят мне и меня раздражают :(

!!! КАК ПРОВЕРИТЬ НА НАЛИЧИЕ УКАЗАННОГО КЛЮЧА С УКАЗАННЫМИ ПАРАМЕТРАМИ В РЕЕСТРЕ ???

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 maza_____



ICQ: 9968842 

Вопросов: 40
Ответов: 337
 Web-сайт: vkontakte.ru/id25563295 добавляйтесь в друзья))
 Профиль | | #1
Добавлено: 15.11.09 13:38
Попытаться считать из него информацию, если получишь исключение значит ключа нет

Ответить

Номер ответа: 2
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #2 Добавлено: 15.11.09 15:10
Новая запись обновляет одноименную старую запись реестра,
т.е. 10 записей одной и тойже программы на автозапуск дадут не 10 значений в реестре, а только одно.
Так должно быть если для автозапуска ты указываешь путь к разделу Run и имя значения в этом разделе.
Прога может запускаться дважды если например 1я копия стартует от значения в разделе Run, а 2я от линка в папке Программы\Автозапуск.
Проверить наличие значения можно при считывании, апишка помоему возвращает 0 вместо 1

Ответить

Номер ответа: 3
Автор ответа:
 Millenium



ICQ: 629966 

Вопросов: 118
Ответов: 903
 Web-сайт: www.aliyev.us
 Профиль | | #3
Добавлено: 15.11.09 15:48
Проблема в том что я в реестр ввожу 1 запись! Но какойто косяк в системе (в 2х машинах и 7и) показывает один и тот-же ключь с добавкой в конце (1). Я проверил свой код. Там ничего такого. А в Автозапуск (в папку в меню старт) я не ставлю (пользователь может удалить :(.
Тогда видать какая-то утилитка у них сидит. Буду копаться в системе. Спасибо всем.

Ответить

Номер ответа: 4
Автор ответа:
 Дмитрий Юпатов



Вопросов: 4
Ответов: 457
 Web-сайт: cargomaster.at.ua/
 Профиль | | #4
Добавлено: 15.11.09 15:54
а может вместо вывода надписи "Одна копия программы уже запущено!" пусть вторая копия себя глушит?

Ответить

Номер ответа: 5
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #5
Добавлено: 15.11.09 17:21
почти оффтоп. я вот создаю окно с уникальным заголовком при запуске и не нужен мне реестр)
  1. Option Explicit
  2. Private Declare Function DefWindowProc Lib "user32.dll" Alias "DefWindowProcA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  3. Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
  4. Private Const WM_COPYDATA As Long = &H4A
  5. Private Type COPYDATASTRUCT
  6.     dwData As Long
  7.     cbData As Long
  8.     lpData As Long
  9. End Type
  10. Private Declare Function CreateWindowEx Lib "user32.dll" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hmenu As Long, ByVal hInstance As Long, ByRef lpParam As Any) As Long
  11. Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  12. Private Const GWL_WNDPROC As Long = -4
  13. Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  14. Private Declare Function DestroyWindow Lib "user32.dll" (ByVal hWnd As Long) As Long
  15. Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
  16. Private wnd As Long, dummy As Long, serverChecked As Boolean
  17.  
  18. Private Const WINDOW_NAME As String = "Audica_Dummy"
  19. Private commandBuffer As New Collection
  20.  
  21. 'Если не найден сервер \false\
  22. Public Function int_isClient() As Boolean
  23.     If Not serverChecked Then
  24.         If Not b(wnd, FindWindow(vbNullString, WINDOW_NAME)) Then _
  25.             int_becomeServer
  26.         serverChecked = True 'Флаг проверки
  27.     End If
  28.     int_isClient = wnd
  29. End Function
  30.  
  31. 'Стать сервером
  32. Private Sub int_becomeServer()
  33.     dummy = CreateWindowEx(0, "STATIC", WINDOW_NAME, 0, 0, 0, 0, 0, 0, 0, 0, ByVal 0)
  34.     SetWindowLong dummy, GWL_WNDPROC, AddressOf int_WindowProc
  35. End Sub
  36.  
  37. 'Отправить строку серверу
  38. Public Sub int_sendData(ByVal str As String, ByVal id As Long)
  39.     Dim dat As COPYDATASTRUCT
  40.     dat.cbData = LenB(str)
  41.     dat.lpData = StrPtr(str)
  42.     SendMessage wnd, WM_COPYDATA, id, dat
  43. End Sub
  44.  
  45. 'Выключить сервер (если int_isClient = false)
  46. Public Sub int_destroyServer_ifNotClient()
  47.     If Not int_isClient Then _
  48.         DestroyWindow dummy
  49. End Sub
  50.  
  51. Private Function int_WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  52.     Dim cds As COPYDATASTRUCT
  53.     If uMsg = WM_COPYDATA Then
  54.         Call CopyMemory(cds, ByVal lParam, Len(cds))
  55.         ReDim buf(cds.cbData - 1) As Byte
  56.         Call CopyMemory(buf(0), ByVal cds.lpData, cds.cbData)
  57.  
  58.         'Тут можно обрабатывать полученную в buf() строку
  59.  
  60.     End If
  61.     int_WindowProc = DefWindowProc(hWnd, uMsg, wParam, lParam)
  62. End Function

Ответить

Номер ответа: 6
Автор ответа:
 Millenium



ICQ: 629966 

Вопросов: 118
Ответов: 903
 Web-сайт: www.aliyev.us
 Профиль | | #6
Добавлено: 19.11.09 00:08
Всё дело было в пользователях :) В одном месте было прописано под систему, а в другом под конкретного пользователя (HKLM, KHLU)/ Спасибо всем! Разобрался :)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам