Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

ëÁË ÐÅÒÅÈ×ÁÔÉÔØ?

2 views
Skip to first unread message

Alexander Belinsky

unread,
May 22, 2004, 5:39:22 PM5/22/04
to
||*()*|| Ах это вы, All ? А я вас не узнал без санитара...

Требуется "перехватывать" даблклик юзера по файлу ассоциированному с
моим приложением. Чтобы как, например, в Ворде97 если вызвать 10 документов, то
откроются не 10 Вордов, а 1 в котором эти 10 документов будут открыты.
If App.PrevInstance Then ... я уже сделал.

I'll be back, All !
http://www.caligari.zp.ua - реальная психологическая и психиатрическая помощь.
Анонимно. Пока бесплатно.

A. Skrobov

unread,
May 23, 2004, 3:50:54 AM5/23/04
to
Hello, Alexander!
You wrote in conference fido7.ru.visual.basic to "All"
<fido7.ru.v...@talk.ru>to All on Sun, 23 May 2004 01:39:22 +0400:

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

A. Skrobov

unread,
May 23, 2004, 5:39:54 AM5/23/04
to
Hello, A.!
You wrote in conference fido7.ru.visual.basic to "Alexander
Belinsky" <fido7.ru.v...@talk.ru>to Alexander Belinsky on Sun, 23
May 2004 07:50:54 +0000 (UTC):

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================

Alexander Belinsky

unread,
May 23, 2004, 3:41:19 AM5/23/04
to
||*()*|| Ах это вы, A ? А я вас не узнал без санитара...

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. !

Alexander Belinsky

unread,
May 23, 2004, 10:01:30 AM5/23/04
to
||*()*|| Ах это вы, A ? А я вас не узнал без санитара...

23 май 04 года ты писал(а) к тебе:

[...skipped...]

AS>> Из второго запущенного экземпляра находишь первый и передаёшь ему

AS>> имя файла любым способом. Способов тыща - сообщения, трубы,
AS>> мэйлслоты, шареная память и т.д. Если нужно, могу сбацать пример.
AS>> Hужно?
AS> Вот пример через мэйлслоты:

[...skipped...]

Hу и геморрой!!!
Спасибо, конечно, но я придумал способ попроще: запустившись первое
приложение оставляет "метку" в реестре и с помощью того же таймера отслеживает
не появилось ли похожих меток...
В этом - спасибо за идею с таймером.

Roman Yuakovlev

unread,
May 23, 2004, 9:20:47 PM5/23/04
to

AS>>> Из второго запущенного экземпляра находишь первый и передаёшь
AS>>> ему имя файла любым способом. Способов тыща - сообщения, трубы,

AS>>> мэйлслоты, шареная память и т.д. Если нужно, могу сбацать
AS>>> пример. Hужно?

AS>> Вот пример через мэйлслоты:
AB> [...skipped...]
AB> Hу и геморрой!!!
AB> Спасибо, конечно, но я придумал способ попроще: запустившись
AB> первое приложение оставляет "метку" в реестре и с помощью того же
AB> таймера отслеживает не появилось ли похожих меток...
AB> В этом - спасибо за идею с таймером.
Можно и флажком - но это все тормоза.

Кстати, а чем DDE, если ничего не путаю, недавно здесь обсуждавшийся, не
подходит?


... все равно его не брошу потому что жаба давит...

A. Skrobov

unread,
May 24, 2004, 1:44:01 AM5/24/04
to
Hello, Alexander!
You wrote in conference fido7.ru.visual.basic to "A.Skrobov"
<fido7.ru.v...@talk.ru>to A. Skrobov on Sun, 23 May 2004 18:01:30
+0400:

AS>> Вот пример через мэйлслоты:

AB> [...skipped...]
AB> Hу и геморрой!!!

AB> Спасибо, конечно, но я придумал способ попроще: запустившись
AB> первое приложение оставляет "метку" в реестре и с помощью того же
AB> таймера отслеживает не появилось ли похожих меток...
AB> В этом - спасибо за идею с таймером.
А оно точно не оставит в реестре кучу мусора при некорректном завершении?

A. Skrobov

unread,
May 24, 2004, 1:14:01 PM5/24/04
to
Hello, A.!
You wrote in conference fido7.ru.visual.basic to "Alexander
Belinsky" <fido7.ru.v...@talk.ru>to Alexander Belinsky on Mon, 24
May 2004 05:44:01 +0000 (UTC):

AS>>> Вот пример через мэйлслоты:
AB>> [...skipped...]
AB>> Hу и геморрой!!!
AB>> Спасибо, конечно, но я придумал способ попроще: запустившись
AB>> первое приложение оставляет "метку" в реестре и с помощью того же
AB>> таймера отслеживает не появилось ли похожих меток...
AB>> В этом - спасибо за идею с таймером.

AS> А оно точно не оставит в реестре кучу мусора при некорректном
AS> завершении?
Чё-то ты, видимо, не понял серьёзность ситуации.
Смотри, я запустил первый экземпляр. Он запустился, оставил метку в реестре.
Злой Чубайс дёрнул рубильник, и комп выключился. Метка в реестре осталась.
Я включаю комп вновь и запускаю твою программу.
Она видит метку в реестре, оставляет новую и выходит. Так?
Получится, теперь твою прогу никак не запустить!

Alexander Belinsky

unread,
May 24, 2004, 11:06:49 AM5/24/04
to
||*()*|| Ах это вы, A ? А я вас не узнал без санитара...

24 май 04 года ты писал(а) к мне:

[...skipped...]

AB>> В этом - спасибо за идею с таймером.
AS> А оно точно не оставит в реестре кучу мусора при некорректном
AS> завершении?

Я продумал и это.
Sub Main начинается с того, что очищает этот параметр, а далее в
зависимости от того первый или второй экземпляр программы запущен обрабатывает
коммандную строку или соответственно записывает ее в параметр и завершает
программу.

Alexander Belinsky

unread,
May 24, 2004, 11:04:37 AM5/24/04
to
||*()*|| Ах это вы, Roman ? А я вас не узнал без санитара...

24 май 04 года ты писал(а) к мне:


[...skipped...]

RY> Кстати, а чем DDE, если ничего не путаю, недавно здесь обсуждавшийся,
RY> не подходит?

Бррр... Со времен VB 3.0 DDE не пользовался. Примерчик можно?

I'll be back, Roman !

A. Skrobov

unread,
May 24, 2004, 3:07:37 PM5/24/04
to
Hello, Alexander!
You wrote in conference fido7.ru.visual.basic to "A.Skrobov"
<fido7.ru.v...@talk.ru>to A. Skrobov on Mon, 24 May 2004 19:06:49
+0400:

AB>>> В этом - спасибо за идею с таймером.
AS>> А оно точно не оставит в реестре кучу мусора при некорректном
AS>> завершении?

AB> Я продумал и это.
AB> Sub Main начинается с того, что очищает этот параметр, а далее
AB> в зависимости от того первый или второй экземпляр программы запущен
Смотришь по App.PrevInstance? Плохой метод, если копия exe-файла уже
запущена, оно вернёт False. Получится несколько одновременно работающих
первых экземпляров ;-)

AB> обрабатывает коммандную строку или соответственно записывает ее в
AB> параметр и завершает программу.
Т.е. очищаешь параметр даже без проверки, первый ли это экземпляр? Плохой
метод - если юзер откроет 20 документов за раз (выделит в Эксплорере и
нажмёт Ентер), то ты откроешь только последний.

Alexander Belinsky

unread,
May 24, 2004, 2:08:37 PM5/24/04
to
||*()*|| Ах это вы, A ? А я вас не узнал без санитара...

24 май 04 года ты писал(а) к тебе:

[...skipped...]

AS> Чё-то ты, видимо, не понял серьёзность ситуации.
AS> Смотри, я запустил первый экземпляр. Он запустился, оставил метку в
AS> реестре. Злой Чубайс

Гы! Hу у нас Чубайс пока не повелитель лампочек.

AS> дёрнул рубильник, и комп выключился. Метка в
AS> реестре осталась. Я включаю комп вновь и запускаю твою программу. Она
AS> видит метку в реестре, оставляет новую и выходит. Так?

Hет. Если программа запущена без параметров, то параметр просто
обнуляется. Если с параметром - записывается он.

[...skipped...]

I'll be back, A. !

Roman Yuakovlev

unread,
May 25, 2004, 4:50:15 AM5/25/04
to

RY>> Кстати, а чем DDE, если ничего не путаю, недавно здесь
RY>> обсуждавшийся, не подходит?
AB> Бррр... Со времен VB 3.0 DDE не пользовался. Примерчик можно?
Hет, обсуждалось это не здесь. А где - не помню. ;)

Смотри хелп на .Link*

Alexander Belinsky

unread,
May 25, 2004, 3:01:34 PM5/25/04
to
||*()*|| Ах это вы, A ? А я вас не узнал без санитара...

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> Эксплорере и нажмёт Ентер), то ты откроешь только последний.

Хм... Завтра попробую.

A. Skrobov

unread,
May 26, 2004, 10:17:14 AM5/26/04
to
Hello, Alexander!
You wrote in conference fido7.ru.visual.basic to "A.Skrobov"
<fido7.ru.v...@talk.ru>to A. Skrobov on Tue, 25 May 2004 23:01:34
+0400:

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
Скомпилируй, скопируй ехешник под другим именем и запусти оба одновременно.

0 new messages