Требуется "перехватывать" даблклик юзера по файлу ассоциированному с
моим приложением. Чтобы как, например, в Ворде97 если вызвать 10 документов, то
откроются не 10 Вордов, а 1 в котором эти 10 документов будут открыты.
If App.PrevInstance Then ... я уже сделал.
I'll be back, All !
http://www.caligari.zp.ua - реальная психологическая и психиатрическая помощь.
Анонимно. Пока бесплатно.
AB> Требуется "перехватывать" даблклик юзера по файлу
AB> ассоциированному с моим приложением. Чтобы как, например, в Ворде97
AB> если вызвать 10 документов, то откроются не 10 Вордов, а 1 в котором
AB> эти 10 документов будут открыты.
AB> If App.PrevInstance Then ... я уже сделал.
Из второго запущенного экземпляра находишь первый и передаёшь ему имя файла
любым способом. Способов тыща - сообщения, трубы, мэйлслоты, шареная память
и т.д. Если нужно, могу сбацать пример. Нужно?
With best regards, A. Skrobov. E-mail: tyom...@r66.ru
--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
AB>> Требуется "перехватывать" даблклик юзера по файлу
AB>> ассоциированному с моим приложением. Чтобы как, например, в Ворде97
AB>> если вызвать 10 документов, то откроются не 10 Вордов, а 1 в котором
AB>> эти 10 документов будут открыты.
AB>> If App.PrevInstance Then ... я уже сделал.
AS> Из второго запущенного экземпляра находишь первый и передаёшь ему имя
AS> файла любым способом. Способов тыща - сообщения, трубы, мэйлслоты,
AS> шареная память и т.д. Если нужно, могу сбацать пример. Нужно?
Вот пример через мэйлслоты:
=========Beginning of the citation==============
VERSION 5.00
Begin VB.Form Form1
AutoRedraw = -1 'True
Caption = "Form1"
ClientHeight = 3195
ClientLeft = 60
ClientTop = 345
ClientWidth = 4680
LinkTopic = "Form1"
ScaleHeight = 3195
ScaleWidth = 4680
StartUpPosition = 3 'Windows Default
Begin VB.Timer tmrCheck
Interval = 100
Left = 1800
Top = 1320
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Private Declare Function CreateMailslot Lib "kernel32" Alias
"CreateMailslotA" (ByVal lpName As String, ByVal nMaxMessageSize As Long,
ByVal lReadTimeout As Long, lpSecurityAttributes As Any) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA"
(ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal
dwShareMode As Long, lpSecurityAttributes As Any, ByVal
dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal
hTemplateFile As Long) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, ByVal
lpBuffer As String, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead
As Long, lpOverlapped As Any) As Long
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long,
ByVal lpBuffer As String, ByVal nNumberOfBytesToWrite As Long,
lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long
Private Const GENERIC_WRITE As Long = &H40000000
Private Const FILE_SHARE_READ = &H1
Private Const OPEN_EXISTING As Long = 3&
Private Const FILE_ATTRIBUTE_NORMAL = &H80
Private Const INVALID_HANDLE_VALUE As Long = -1&
Private Const MailslotName As String = "\\.\mailslot\mytestapp"
Private Dummy As Long
Private hFile As Long
Sub Form_Load()
hFile = CreateFile(MailslotName, GENERIC_WRITE, FILE_SHARE_READ, ByVal 0&,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
If hFile <> INVALID_HANDLE_VALUE Then
WriteFile hFile, Command, Len(Command), Dummy, ByVal 0&
Unload Me
Else
hFile = CreateMailslot(MailslotName, 0, 0, ByVal 0&)
Print "Primary app launched with Command=""" & Command & """"
End If
End Sub
Private Sub tmrCheck_Timer()
Dim Buffer As String * 256
ReadFile hFile, Buffer, 255, Dummy, ByVal 0&
If Dummy > 0 Then _
Print "Secondary app launched with Command=""" & Left$(Buffer,
Dummy) & """"
End Sub
=========The end of the citation================
23 май 04 года ты писал(а) к мне:
[...skipped...]
AB>> Требуется "перехватывать" даблклик юзера по файлу
AB>> ассоциированному с моим приложением. Чтобы как, например, в
AB>> Ворде97 если вызвать 10 документов, то откроются не 10 Вордов, а
AB>> 1 в котором эти 10 документов будут открыты.
AB>> If App.PrevInstance Then ... я уже сделал.
AS> Из второго запущенного экземпляра находишь первый и передаёшь ему имя
AS> файла любым способом. Способов тыща - сообщения, трубы, мэйлслоты,
AS> шареная память и т.д. Если нужно, могу сбацать пример. Hужно?
Да! Очень желательно!
[...skipped...]
I'll be back, A. !
23 май 04 года ты писал(а) к тебе:
[...skipped...]
AS>> Из второго запущенного экземпляра находишь первый и передаёшь ему
AS>> имя файла любым способом. Способов тыща - сообщения, трубы,
AS>> мэйлслоты, шареная память и т.д. Если нужно, могу сбацать пример.
AS>> Hужно?
AS> Вот пример через мэйлслоты:
[...skipped...]
Hу и геморрой!!!
Спасибо, конечно, но я придумал способ попроще: запустившись первое
приложение оставляет "метку" в реестре и с помощью того же таймера отслеживает
не появилось ли похожих меток...
В этом - спасибо за идею с таймером.
Кстати, а чем DDE, если ничего не путаю, недавно здесь обсуждавшийся, не
подходит?
... все равно его не брошу потому что жаба давит...
AS>> Вот пример через мэйлслоты:
AB> [...skipped...]
AB> Hу и геморрой!!!
AB> Спасибо, конечно, но я придумал способ попроще: запустившись
AB> первое приложение оставляет "метку" в реестре и с помощью того же
AB> таймера отслеживает не появилось ли похожих меток...
AB> В этом - спасибо за идею с таймером.
А оно точно не оставит в реестре кучу мусора при некорректном завершении?
AS>>> Вот пример через мэйлслоты:
AB>> [...skipped...]
AB>> Hу и геморрой!!!
AB>> Спасибо, конечно, но я придумал способ попроще: запустившись
AB>> первое приложение оставляет "метку" в реестре и с помощью того же
AB>> таймера отслеживает не появилось ли похожих меток...
AB>> В этом - спасибо за идею с таймером.
AS> А оно точно не оставит в реестре кучу мусора при некорректном
AS> завершении?
Чё-то ты, видимо, не понял серьёзность ситуации.
Смотри, я запустил первый экземпляр. Он запустился, оставил метку в реестре.
Злой Чубайс дёрнул рубильник, и комп выключился. Метка в реестре осталась.
Я включаю комп вновь и запускаю твою программу.
Она видит метку в реестре, оставляет новую и выходит. Так?
Получится, теперь твою прогу никак не запустить!
24 май 04 года ты писал(а) к мне:
[...skipped...]
AB>> В этом - спасибо за идею с таймером.
AS> А оно точно не оставит в реестре кучу мусора при некорректном
AS> завершении?
Я продумал и это.
Sub Main начинается с того, что очищает этот параметр, а далее в
зависимости от того первый или второй экземпляр программы запущен обрабатывает
коммандную строку или соответственно записывает ее в параметр и завершает
программу.
24 май 04 года ты писал(а) к мне:
[...skipped...]
RY> Кстати, а чем DDE, если ничего не путаю, недавно здесь обсуждавшийся,
RY> не подходит?
Бррр... Со времен VB 3.0 DDE не пользовался. Примерчик можно?
I'll be back, Roman !
AB>>> В этом - спасибо за идею с таймером.
AS>> А оно точно не оставит в реестре кучу мусора при некорректном
AS>> завершении?
AB> Я продумал и это.
AB> Sub Main начинается с того, что очищает этот параметр, а далее
AB> в зависимости от того первый или второй экземпляр программы запущен
Смотришь по App.PrevInstance? Плохой метод, если копия exe-файла уже
запущена, оно вернёт False. Получится несколько одновременно работающих
первых экземпляров ;-)
AB> обрабатывает коммандную строку или соответственно записывает ее в
AB> параметр и завершает программу.
Т.е. очищаешь параметр даже без проверки, первый ли это экземпляр? Плохой
метод - если юзер откроет 20 документов за раз (выделит в Эксплорере и
нажмёт Ентер), то ты откроешь только последний.
24 май 04 года ты писал(а) к тебе:
[...skipped...]
AS> Чё-то ты, видимо, не понял серьёзность ситуации.
AS> Смотри, я запустил первый экземпляр. Он запустился, оставил метку в
AS> реестре. Злой Чубайс
Гы! Hу у нас Чубайс пока не повелитель лампочек.
AS> дёрнул рубильник, и комп выключился. Метка в
AS> реестре осталась. Я включаю комп вновь и запускаю твою программу. Она
AS> видит метку в реестре, оставляет новую и выходит. Так?
Hет. Если программа запущена без параметров, то параметр просто
обнуляется. Если с параметром - записывается он.
[...skipped...]
I'll be back, A. !
Смотри хелп на .Link*
24 май 04 года ты писал(а) к мне:
AB>>>> В этом - спасибо за идею с таймером.
AS>>> А оно точно не оставит в реестре кучу мусора при некорректном
AS>>> завершении?
AB>> Я продумал и это.
AB>> Sub Main начинается с того, что очищает этот параметр, а
AB>> далее в зависимости от того первый или второй экземпляр программы
AB>> запущен
AS> Смотришь по App.PrevInstance? Плохой метод, если копия exe-файла уже
AS> запущена, оно вернёт False. Получится несколько одновременно
AS> работающих первых экземпляров ;-)
Sub Main()
If App.PrevInstance = True Then
SaveSetting "CALIGARI", "COMMON", "OpenIt", Command
End
Else
SaveSetting "CALIGARI", "COMMON", "OpenIt", ""
End If
AB>> обрабатывает коммандную строку или соответственно записывает ее в
AB>> параметр и завершает программу.
AS> Т.е. очищаешь параметр даже без проверки, первый ли это экземпляр?
AS> Плохой метод - если юзер откроет 20 документов за раз (выделит в
AS> Эксплорере и нажмёт Ентер), то ты откроешь только последний.
Хм... Завтра попробую.
AS>> Смотришь по App.PrevInstance? Плохой метод, если копия exe-файла уже
Ключевое слово здесь - "копия"
AS>> запущена, оно вернёт False. Получится несколько одновременно
AS>> работающих первых экземпляров ;-)
AB> Sub Main()
AB> If App.PrevInstance = True Then
AB> SaveSetting "CALIGARI", "COMMON", "OpenIt", Command
AB> End
AB> Else
AB> SaveSetting "CALIGARI", "COMMON", "OpenIt", ""
AB> End If
Скомпилируй, скопируй ехешник под другим именем и запусти оба одновременно.