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