Comment puis je dire à chaque nouvelle instance d'un programme, qu'une fois appellée, vérifie s'il y a une instance précédente qui n'a pas fini son travail (envois de message avec l'api sendmessage), si c'est le cas, attend jusqu'où l'instance précédente fini son travail avant d'envoyer ton message à toi... et ainsi de suite ..
C'est à dire meme si j'appelle une centaines d'instances de mon application à la fois, elles s'organisent de sortent à ce que l'une travaille après l'autres et jamais deux en meme temps....
===>Comme si je place les différentes instances dans une file d'attente.
Pour ceux qui ont suivi mon sujet précédent concernant l'ajout de mon application au menu contextuel, ils vont comprendre ce que je veux, pour les autres, je vais essayer d'expliquer ça avec un autre exemple...
J'ai trouvé un code, qui permet d'envoyer le nom d'un fichier sur lequel on a fait click droit à notre application qui le traite
Dans ce code, chaque nouvelle instance, recoit le nom du fichier avec command$, et envoi le nom (lettre par lettre) à WndProc() , par l'api SendMessage.
WndProc(), donc reçoit le nom du fichier (lettre par lettre), recompose son nom entier, et appelle une fonction OpenFile qui à son tour traite le fichier (ajouter à une listbox ou faire autre chose)
ça fonctionne superbien comme pour DDE quand on a une seule instance , c'est à dire, un seul fichier a envoyé...mais dès qu'on selectionne plusieurs fichiers, là vient le probleme :
Plusieurs instance sont lancées (une par fichier) ce qui est normal, et elles travaillent toutes en meme temps (d'ou le probleme que ça soit ici ou avec DDE, j'ai le meme probleme je pense) ... Vu que toutes les instances travaillent en meme temps et non pas l'une après l'autre, le nom de fichiers reçu par WndProc() est incorrecte
par example, si j'ai 3 fichiers C:\file1.txt C:\file2.txt C:\file3.txt , 3 instances sont ouvertes en meme temps, et envois le nom de fichier (plus ou moins en meme temps) à la procédure WndProc() qui ne va pas pouvoir composer le bon nom du fichier et au lieu d'obtenir un truc du genre C:\file1.txt then C:\file2.txt then C:\file3.txt , on aura
CCC:::\\\fffiiillleee123...tttxxxttt (peut etre pas dans cet ordre mais qqch du genre) et c'est normal car elle recoit plus ou moins 3 send messages en meme temps. chacune venant d'une instance(d'un fichier), et non pas le premier fichier, ensuite le 2eme, ensuite le 3eme...
voici le code pour mieux comprendre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Option Explicit Private Sub Form_Load() MyMessageId = RegisterWindowMessage(PrivateMessage) Dim FileName As String FileName = Command$ If App.PrevInstance Then If Len(FileName) Then Dim N As Long For N = 1 To Len(FileName) SendMessage HWND_BROADCAST, MyMessageId, Asc(Mid$(FileName, N)), ByVal 0& DoEvents Next SendMessage HWND_BROADCAST, MyMessageId, 0, ByVal 0& 'terminate the string End If Unload Me Else Show If Len(FileName) Then OpenFile FileName lpWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WndProc) End If End Sub
Module1 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Const PrivateMessage As String = "This is my application's private message" '<- Change this to a suitable message string Public MyMessageId As Long Public lpWndProc As Long Public Const HWND_BROADCAST = &HFFFFFFFF Public Const GWL_WNDPROC = (-4) Public Function WndProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If uMsg = MyMessageId Then Static FileName As String If wParam Then FileName = FileName & Chr$(wParam) Else OpenFile FileName FileName = vbNullString End If End If WndProc = CallWindowProc(lpWndProc, hWnd, uMsg, wParam, lParam) End Function Public Sub OpenFile(FileName As String) ' List1.AddItem FileName ' End Sub
Partager