cs_aKheNathOn
Messages postés575Date d'inscriptiondimanche 23 décembre 2001StatutMembreDernière intervention23 octobre 2012
-
11 juil. 2007 à 13:03
cs_aKheNathOn
Messages postés575Date d'inscriptiondimanche 23 décembre 2001StatutMembreDernière intervention23 octobre 2012
-
11 juil. 2007 à 16:21
Bonjour,
Je me perd un peu dans les termes BHO et ATL. Je veux juste créer un simple utilitaire permettant d'intercepter les événements d'une instance IE comme par exemple DocumentComplete.
Ma question est la suivante, comment je dois m'y prendre pour hooker une instance d'IE et la charger en tant qu'objet COM par exemple ce qui me permettrais d'intercepter tous les événements. Ceci à partir du handle de l'objet COM par exemple.
cs_aKheNathOn
Messages postés575Date d'inscriptiondimanche 23 décembre 2001StatutMembreDernière intervention23 octobre 2012 11 juil. 2007 à 13:54
Voici le code écrit pour le test :
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Public WithEvents oIE As InternetExplorer
Private Sub Form_Load()
Dim handleIE As Long
handleIE = FindWindow("IEFrame", vbNullString)
If handleIE <> 0 Then
CopyMemory oIE, ByVal handleIE, 4
Else
MsgBox "Aucune instance IE lancée"
End
End If
End Sub
Private Sub oIE_DocumentComplete(ByVal pDisp As Object, URL As Variant)
MsgBox URL
End Sub
Brèf, ça plante sans message d'erreur - détails du rapport d'erreur :
cs_aKheNathOn
Messages postés575Date d'inscriptiondimanche 23 décembre 2001StatutMembreDernière intervention23 octobre 2012 11 juil. 2007 à 16:12
J'ai parcontre toujours le même problème à moins que je pointe vers le mauvais handle :
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Public WithEvents oIE As InternetExplorer
Private Sub Form_Load()
Dim handleIE As Long
' IE 7 COMPATIBLE ONLY
handleIE = FindWindow("IEFrame", vbNullString)
If handleIE <> 0 Then handleIE = GetHwndFromWay("TabWindowClass/Shell DocObject View/Internet Explorer_Server", handleIE)
If handleIE <> 0 Then
CopyMemory oIE, ByVal handleIE, 4
Else
MsgBox "Aucune instance IE lancée"
End
End If
End Sub
Private Sub oIE_DocumentComplete(ByVal pDisp As Object, URL As Variant)
MsgBox URL
End Sub
Private Function GetHwndFromWay(way As String, parent As Long) As Long
Dim classes() As String
Dim i As Integer
Dim hwnd As Long
classes = Split(way, "/")
hwnd = parent
For i = 0 To UBound(classes)
hwnd = FindWindowEx(hwnd, ByVal 0&, classes(i), vbNullString)
If hwnd = 0 Then
GetHwndFromWay = 0
Exit Function
End If
Next i
GetHwndFromWay = hwnd
End Function
Il me retourne le handle de Internet Explorer_Server et je pense que ce doit être la référence de l'objet COM. En tout cas pas de message d'erreur mais un méchant plantage de VB.
aKheNAtHoN
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_aKheNathOn
Messages postés575Date d'inscriptiondimanche 23 décembre 2001StatutMembreDernière intervention23 octobre 2012 11 juil. 2007 à 16:21
CopyMemory n'attend peut-être pas un handle mais l'adresse d'un pointeur en mémoire. Si oui comment le récupérer, et est-ce que l'objet étant dans une autre appli j'ai le droit avec copymemory d'y accéder ...
Tu lances un IE tout simplement, tu lances vb d'un autre côté. Faut que vb fasse un subclassing ou autre sur les événements de cet objet com. Pour ça je pensais que seul en faisant un hook sur l'appli il étais possible d'intercepter les messages mais c'est galère et c'est pas documenté au niveau des constantes. En plus il faut obligatoirement une dll en C++ qui fasse le lien entre les deux.
Y'à pas un moyen simple de le faire sans avoir à déclarer 10000 fonctions ?