shadowmoy
Messages postés340Date d'inscriptionjeudi 25 juillet 2002StatutMembreDernière intervention25 août 2007
-
14 janv. 2004 à 00:43
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 2019
-
23 mai 2011 à 00:20
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 23 mai 2011 à 00:20
It crash because of the VBVM.
Ca pete a cause de la VBVM.
RAFAAJ2000
Messages postés16Date d'inscriptionsamedi 27 mars 2010StatutMembreDernière intervention30 décembre 2012 22 mai 2011 à 16:12
Sorry for the confusion EB.
The Increment Function example I posted above ( with the added MsgBox ) is in the dll .
and the actual DLL function call that crashes VBA is as follows :
Public Declare Function Increment Lib _
"C:\Documents and Settings\Jaafar\Bureau\MyDLL\mathlib.dll" ( _
value As Integer) As Integer
Private Sub cmdIncrement_Click()
Range("a10") = Increment(1)
End Sub
RAFAAJ2000
Messages postés16Date d'inscriptionsamedi 27 mars 2010StatutMembreDernière intervention30 décembre 2012 22 mai 2011 à 16:03
Hi EB again.
As a matter of curiosity, did you try the trick for making standard dlls from ActiveX dlls like explained in the above link?
I did follow the steps and managed to make it work but when I add a small change to the exported functions (see below) and run the dll from Excel-VBA the excel application crashes !
1 -Original code ( + a simple MsgBox )that works when ran from a VB Standard VB : No crashing.
Public Declare Function Increment Lib _
"C:\Documents and Settings\Jaafar\Bureau\MyDLL\mathlib.dll" ( _
value As Integer) As Integer
Public Function Increment(var As Integer) As Integer
If Not IsNumeric(var) Then Err.Raise 5
MsgBox var
Increment = var + 1
End Function
2 -Code ran from excel VBA that CRASHES when the MsgBox is added :
Public Function Increment(var As Integer) As Integer
If Not IsNumeric(var) Then Err.Raise 5
MsgBox var
Increment = var + 1
End Function
In fact, except wotking with variables, the exported Functions will always crash if another COM function or even another API function is called but only when the client is VBA not VB !
I would appreciate if you could share your knowledge of this kind of stuff and shade some light on this to see if/how this could be worked around.
Regards.
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 21 mai 2011 à 20:05
If you add a DllMain function using this trick you will bypass the VBVM initialization resulting in a very instable state of your dll. But... it could work if you avoid any VBVM call. For example manipulating string in the DllMain will cause a seg fault because VB need to initialize the VM before doing any other things.
Si tu utilises une fonction DllMain avec cette astuce tu vas faire sauter l'initialisation de la VBVM ce qui va rendre ton programme très instable. Cela pourrait tout de même marcher si tu évite tout appel a la VM. Par exemple si tu manipule une chaîne de caractère tu vas avoir droit a un beau seg fault car VB doit initialiser la VM avant de faire quoi que ce soit d'autre.
RAFAAJ2000
Messages postés16Date d'inscriptionsamedi 27 mars 2010StatutMembreDernière intervention30 décembre 2012 21 mai 2011 à 18:13
RAFAAJ2000
Messages postés16Date d'inscriptionsamedi 27 mars 2010StatutMembreDernière intervention30 décembre 2012 21 mai 2011 à 18:00
Thanks EBARTSOFT for the quick response.
Sometime ago, I read somewhere about using a trick to make a VB dll behave like a Windows dll so one could call the VB dll from the Client Program just like a normal dlls ie: Using the "Declare Function xxxx Lib..." calling convention.
Would that solve the problem ?
I'll do a google search and post the link here if I find it (Maybe you already know about this trick ).
As for using C or ASM dll ,as suggested, I don't have the slightest idea about writing code in those two languages.
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 21 mai 2011 à 16:40
It can't work because host process must call CoCreateObject to instanciate a new vb class.
A solution is to use another C or Asm dll that create a new instance of the vb class.
On ne peut pas lancer une dll activex comme on le fait pour une dll classique car vb attend que le programme hote crée une nouvelle instance de la classe pour initialiser la vm. Une solution serait de créer une autre dll en C ou asm pour instancier la classe vb avec CoCreateObject.
RAFAAJ2000
Messages postés16Date d'inscriptionsamedi 27 mars 2010StatutMembreDernière intervention30 décembre 2012 21 mai 2011 à 16:33
Great stuff.
Will this work for ActiveX dlls created in VB6 ?
I have given it a shot by assigning the ActiveX dll PathName to the FileName Const but the ActiveX dll Class Initialize event never gets fired.
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 15 sept. 2008 à 09:09
c'est possible (avec la carte kiwi :p )
MadM@tt
Messages postés2167Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention16 juillet 20091 15 sept. 2008 à 00:38
Salut EB, fantastique code.
Par contre quand tu dis : "un seul hook par app", c'est que tu peux faire un seul hook en tout, ou un seul hook par processus externe au tiens.
(ma question c'est est-ce que je peux sous-classer plusieurs fenetres de plusieurs processus avec ce code ?)
et sinon est-ce possible ?
merci
MadMatt
bouv
Messages postés1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 27 déc. 2006 à 16:08
If uMsg = WM_CLOSE Then
WindowProc = DefWindowProc(hWnd, 0, 0, 0)
Else
WindowProc = DefWindowProc(hWnd, uMsg, wParam, lParam)
End If
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 27 déc. 2006 à 16:02
La defWinProc appelle DestroyWindow() par défaut, suffit de ne pas lui repasser le message.
bouv
Messages postés1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 27 déc. 2006 à 15:53
OK merci du conseil.
Cela dit j'ai observé une appli à l'aide de SPY++ et je n'ai pas vu WM_CLOSE mais seulement WM_DESTROY lors de la fermeture de l'appli.
Faut que je revoit ça...
Sinon, saurais-tu comment bloquer ce fameux message une fois qu'il est intercepté ?
Merci d'avance
++
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 27 déc. 2006 à 15:34
WM_DESTROY est une notif de post traitement, c'est WM_CLOSE qui est à intercepter pour accepter ou non la fermeture.
bouv
Messages postés1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 27 déc. 2006 à 15:26
Salut EB,
J'ai un peu la même question que loulou06.
Comment faire pour bloquer certains messages (ex: WM_DESTROY)
Merci d'avance
++
cs_loulou06
Messages postés15Date d'inscriptionvendredi 12 décembre 2003StatutMembreDernière intervention10 août 2006 19 août 2006 à 07:13
Moi, j'aurais un petite question.
Au passage total RESPECT a cette DLL, de la grande classe .... :-)
L'equipe qui tue Renfield/Ebart
Dans la WindowProc (DLL), je voudrais detourner et ainsi bloquer certains messages
mais ca ne marcha pas, une idee ? Merci d'avance (reponse en pv please)
Function WindowProc(ByVal hWnd As Long, ByVal umsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim mVar As HookSubCls
Dim mData As MyStruct
Select Case umsg
Case WM_SVRCALL
ReadStruct wParam, lParam, mData
For Each mVar In m_Objects
If mVar.hWnd = hWnd Then
mVar.CallBack mData.hWnd, mData.umsg, mData.wParam, mData.lParam
Exit For
End If
Next
'Case 123:
Case Else
If umsg = m_MsgToSuspend Then
'' Dans mon cas: m_MsgToSuspend = 123 / WM_CONTEXTMENU
''#########################################################
WindowProc = 0
Else
WindowProc = DefWindowProc(hWnd, umsg, wParam, lParam)
End If
End Select
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 19 avril 2005 à 12:50
Labview doit dessiner les controles lui meme, et gerer les evennements.... pas de fenetre créee par controle.
pour t'en assurer, tu peux utiliser Spy++ et essayer de capturer un de tes boutons...
metalcoder
Messages postés193Date d'inscriptionjeudi 14 février 2002StatutMembreDernière intervention25 mars 20111 18 avril 2005 à 21:41
Daetips>
J'ai essayer ta solution, elle marche partout et sous Vb non compile mais pas dans labview, dommage. Ton programme reconnait un seul handle sur le programme labview alors qu'il y a 6 boutons, 2 boutons options et des labels...c'est pas grave mais si quelqu'un a une solution.
Metalcoder
daetips
Messages postés142Date d'inscriptionjeudi 10 juillet 2003StatutMembreDernière intervention10 novembre 2007 18 avril 2005 à 20:32
Tien metalcoder
Private Declare Function WindowFromPoint Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (ByRef David As Point) As Long
Private Type Point
x As Long
y As Long
End Type
Private Sub Timer1_Timer()
Dim mypoint As Point
Dim thandle As Long
GetCursorPos mypoint
metalcoder
Messages postés193Date d'inscriptionjeudi 14 février 2002StatutMembreDernière intervention25 mars 20111 20 janv. 2005 à 07:50
J'utilise au travail labview. Labview a la particularité de fonctionner en mode non compilé. j'ai ajouter un utilitaire en VB qui commande Labview (du moins en partie) car je ne peut agir sur les boutons (en mémoire je n'ai que labview.exe, je n'ai pas acces au controle comme une appli standard) J'ai etudier ton programme et il m'as redonner un peu l'espoir de pouvoir controler les controles de labview. Si tu as des conseils pour récuperer le handle d'une appli non compile, n'hesite surtout pas je suis preneur.
A titre d'exemple car je pense que le probleme est le meme que le mien. lancer Vb, faite un bouton sur la fenetre et essayer de trouvé le handle du bouton avec les utilitaires comme spy++...si qqun y arrive ce serait cool
metalcoder
Dragonmaster
Messages postés126Date d'inscriptionvendredi 20 août 2004StatutMembreDernière intervention 3 avril 2009 16 oct. 2004 à 17:50
ça fonctionne pour moi avec notepad, la calculatrice mais pas avec MSN !
Serait - il possible d'ajouter un bouton ou tout autre contole dans l'appli ?
cs_viran
Messages postés104Date d'inscriptionjeudi 6 mai 2004StatutMembreDernière intervention31 décembre 2006 25 sept. 2004 à 16:23
J'ai Windows XP Service pack 2
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 25 sept. 2004 à 16:18
je veux bien le croire.... quel est ton OS ?
quelle manifestation as tu du "ca ne fonctionne pas". Qu'essaies tu de faire exactement.... bref, donne nous quelques indices...
au boulot, j'ai NT4, et chez moi Xp.... (et les deux fonctionnent)
MadM@tt
Messages postés2167Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention16 juillet 20091 25 sept. 2004 à 15:53
Je crois que tu es le seul à avoir des problèmes avec les sources d'EBArtSoft, alors montre nous un peu de quoi tu es capable avant de critiquer.
cs_viran
Messages postés104Date d'inscriptionjeudi 6 mai 2004StatutMembreDernière intervention31 décembre 2006 25 sept. 2004 à 15:50
p e que tu as un autre systeme d'exploitation que moi en tout cas che zmoi ca marche donc je note comme je peux!
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 25 sept. 2004 à 15:47
Tu ne parviens pas a la faire fonctionner, et tu ne donne aucun indice pour que l'n t'aide a la faire fonctionner....
je m'en sers pour une appli que l'on a au boulot, et ca fonctionne très bien, donc....
cs_viran
Messages postés104Date d'inscriptionjeudi 6 mai 2004StatutMembreDernière intervention31 décembre 2006 25 sept. 2004 à 15:43
Bon maintenant arrete de gratter ta source elle marche pas alors si tu veux repasser sur tt mes messages pour me repondre je vais faire de meme et normalement j'aurais du noter 2 ou 3 la prochaine je serais moins cool!
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 21 sept. 2004 à 22:47
viran> t'as decider de passer sur toutes mes sources pour dire n'importe quoi ? Tu n'es pas obligé de regarder la source et encore moins de commenter surtout si en plus tu ne comprend rien...
@+
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 21 sept. 2004 à 21:05
je suis désolé de t'apprendre que cela fonctionne très bien....
dis en plus sur ta config...
cs_viran
Messages postés104Date d'inscriptionjeudi 6 mai 2004StatutMembreDernière intervention31 décembre 2006 21 sept. 2004 à 20:58
T'est trop un clanpin,ton install il a aps les bosn fichiers d'acces,erreurs par ci et par la,bref grosse deception mais comme tu as pondu des sources superbes et que t'a du te donner du mal je te donne 4/10 meme si y marche aps et evite de nous prendres pour des idiots merci!
MadM@tt
Messages postés2167Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention16 juillet 20091 22 août 2004 à 16:33
Et tu met ça en débutant ?? Je trouve ça génial...
daetips
Messages postés142Date d'inscriptionjeudi 10 juillet 2003StatutMembreDernière intervention10 novembre 2007 20 août 2004 à 18:10
Punaise, desfois je me demande si tu dort car tu as posté beaucoup de sources vraiment utiles et qui repoussent les limites du vb (même avec une dll en asm) 10/10.
cs_CrAzYb
Messages postés9Date d'inscriptionsamedi 10 avril 2004StatutMembreDernière intervention30 juillet 2006 12 mai 2004 à 09:58
Super, trés bon boulot. Depuis longtemps je cherchais un truc du genre, histoire de maitriser une appli externe. Trés bien. 10/10
cs_mehdibou
Messages postés365Date d'inscriptionvendredi 24 mai 2002StatutMembreDernière intervention18 octobre 2004 12 févr. 2004 à 21:20
Rien à redire, c'est du EBArtSoft ;)
Source excellente qui utilise plein de points avancés de la programmation que j'aime bien :)
10/10 pour remonter la note... certains n'ont pas dû capter l'intérêt de la source...
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 4 févr. 2004 à 07:42
shadomoy>lol tu veus capter les evenements d'un windowless ?
la faudra m'expliquer comment tu fait alors...
sans fenetre pas de WindowProc donc pas de sous classement !
de plus les labels dans les appli VB ce n'est rien d'autre qu'un appel
a DrawText (donc un dessin) donc tu n'es pas pres de le sous
classer a moin de trouver les points d'entré des fonctions ActiveX
@+
shadowmoy
Messages postés340Date d'inscriptionjeudi 25 juillet 2002StatutMembreDernière intervention25 août 2007 4 févr. 2004 à 06:01
bon ok j' ai capté le potentiel de cette source mais pourquoi par exemple lorsque j'essaie de recuperer l'evenement click d'un label d'une appli vb qui contient bien un label ca ne fonctionne pas ????
foutus controles windowless ...
une idée de comment vb fait ?
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 15 janv. 2004 à 13:36
Au boulot, j'ai une appli qui a une dizaine d'année, et il y a de serieux manques dans l'interface..... certaines choses sont absentes ou mal placées, les raccourcis claviers sont une horreur sans nom !
Le probleme, c'est que mes collegues et moi, passons 70% de notre temps là dessus...
Ce matin je me suis amusé (oui oui, ca m'amuse) a faire une sort de daemon qui rectifierait un peu la chose....
Et je me suis apercu rapdement que sans hook sur cette application, je ne pourrais pas faire grand chose ;)
J'ai donc telechargé ton source, qui m'epate par la quantité de choses qu'il contient ! Kalistor a raison, tu connais bien Win32 !!
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 15 janv. 2004 à 11:13
Oui c'est exact j'ai omis cette dll, je l'ai fait avec MASM32
(assembleur x86) elle n'est pas vraiment au point mais
elle est suffisante pour notre exemple voici le code :
include D:\1_MANU\DOC~2.PRO\DOCUME~1\MASM32\include\windows.inc
include D:\1_MANU\DOC~2.PRO\DOCUME~1\MASM32\include\user32.inc
include D:\1_MANU\DOC~2.PRO\DOCUME~1\MASM32\include\kernel32.inc
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0 ; get each message
cmp eax, 0 ; exit if GetMessage()
je ExitLoop ; returns zero
invoke TranslateMessage, ADDR msg ; translate it
invoke DispatchMessage, ADDR msg ; send it to message proc
jmp StartLoop
ExitLoop:
mov eax,msg.wParam
ret
ThreadProc endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL buffer[128]:byte
Pour ce qui est de la livrer sous forme de data c'est un choix purement personnel car j'ai horreur de trimballer plein de
dll, ocx etc.. donc la je suis au moin sur de sa presence
@+
Kalistor
Messages postés4Date d'inscriptionmardi 14 janvier 2003StatutMembreDernière intervention 1 juin 2004 15 janv. 2004 à 10:22
Joli prog ! ya pas, tu maitrises le Win32.
Juste une remarque : je n'ai pas trouvé le code de la DLL injectée (EBSCLS32.DLL) Ou bien je ne l'ai pas vu ?
Et une question : pourquoi livrer cette DLL sous forme de DATA dans un fichier ressource ? c'était pas plus simple de nous livrer directement la dll ?
Sinon, merci pour ce bout de code, il est tres interessant.
PS : si tu pouvais publier le code de EBSCLS32 ce serait bien !
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 14 janv. 2004 à 17:46
Renfield>Bah quoi ? tu veus un convertisseur EURO/FRANCS ?
j'ai quand meme une grosse chute de tension la ... ouf
je pond que des daubes en ce moment !
BruNews>Aller demain je me met a .NET ! Naaaaan je rigole
Afyn> J'ai debuté avec le GFA Basic sur 1040 ! lol ;-)
(ça fait plein de point commun mine de rien)
J'ai bien reçu ton ZIP et j'en suis encore tout chambouler
je trouve ton interface midi avec la grille et les accord de
gratte terrible !
Mais je me suis pas encore attaqué au code si tu veus
que je regarde un point precis envoi moi un msg
@+
Afyn
Messages postés608Date d'inscriptionsamedi 3 août 2002StatutMembreDernière intervention22 décembre 2016 14 janv. 2004 à 17:37
Moi qui vient de l'ATARI et qui a passé 10 ans sans programmer, j'aimerai bien un petit tutorial sur le Sub Classing. Pas que j'aspire à devenir un dieux comme EB, Renfield et autres pointures du site, mais pour ne pas rester trop à la traine. J'imagine assez que l'on capture les évenements destinés aux fenetres des applis (je fait un parallele avec le GEM sur ATARI ?) et qu'il y a des avantages par rapports aux évenements que l'on peut capturer avec VB (en fait on doit pouvoir tous les lires et les traiter de la façon Ki va bien)
Savez tu Mister EB que le petit symbole /|\ que tu utilises parfois est le symbole d'ATARI ?
Noblesse oblige de rendre aux anciens les merveilles dont ils nous ont fait hériter (encore un terme informatique).
(PS tu as reçu mon ZIP?)
A+
Afyn - NAVEDAC
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 14 janv. 2004 à 15:18
Turbo Basic++ a encore frappe.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 14 janv. 2004 à 08:39
Vous inquietez par pour l'interêt de la chose, EBArtSoft n'est pas du genre à nous pondre un convertisseur Francs/Euros...
Bien que n'ayant pas eu le loisir de telecharger encore le Zip, je suis sur que l'on se trouve fasse à du travail de qualité.
Cela peut permettre pas mal de choses, mais bon, encore faut-il avoir ne serais-ce qu'une idée de ce qu'est le SubClassing...
Cela peut être notament utile pour tout ce qui est KeyLogger.... (on en vois pas mal par moments sur le site).
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 14 janv. 2004 à 08:20
Désolé pour le zip je ne sait pas pk il n'est pas passé la premiere
fois pourtant je telecharge tjrs ma source pour tester et ça avais
bien marché... bizzard ?
Quand à l'interet de la source... je cros que c'est tellement
evident que des fois je me demande bien a qui je m'adresse...
bref on a peut etre pas les memes centres d'interet
@+
carlvb
Messages postés199Date d'inscriptionmercredi 23 avril 2003StatutContributeurDernière intervention25 mai 201711 14 janv. 2004 à 08:18
Effectivement il semblerait que le zip manque.
Lavieillefolle
Messages postés23Date d'inscriptionjeudi 7 août 2003StatutMembreDernière intervention12 avril 2004 14 janv. 2004 à 02:53
L'intéret que je peut imaginer serais que si ton programme appel d'autres programmes nem c plus intéressant pour l'utilisateur.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 14 janv. 2004 à 01:06
EB, tu as oublié le ZIP...
shadowmoy
Messages postés340Date d'inscriptionjeudi 25 juillet 2002StatutMembreDernière intervention25 août 2007 14 janv. 2004 à 00:43
juste une question : quel interet de subclasser une fenetre d'un autre programme ?
23 mai 2011 à 00:20
Ca pete a cause de la VBVM.
22 mai 2011 à 16:12
The Increment Function example I posted above ( with the added MsgBox ) is in the dll .
and the actual DLL function call that crashes VBA is as follows :
Public Declare Function Increment Lib _
"C:\Documents and Settings\Jaafar\Bureau\MyDLL\mathlib.dll" ( _
value As Integer) As Integer
Private Sub cmdIncrement_Click()
Range("a10") = Increment(1)
End Sub
22 mai 2011 à 16:03
As a matter of curiosity, did you try the trick for making standard dlls from ActiveX dlls like explained in the above link?
I did follow the steps and managed to make it work but when I add a small change to the exported functions (see below) and run the dll from Excel-VBA the excel application crashes !
1 -Original code ( + a simple MsgBox )that works when ran from a VB Standard VB : No crashing.
Public Declare Function Increment Lib _
"C:\Documents and Settings\Jaafar\Bureau\MyDLL\mathlib.dll" ( _
value As Integer) As Integer
Public Function Increment(var As Integer) As Integer
If Not IsNumeric(var) Then Err.Raise 5
MsgBox var
Increment = var + 1
End Function
2 -Code ran from excel VBA that CRASHES when the MsgBox is added :
Public Function Increment(var As Integer) As Integer
If Not IsNumeric(var) Then Err.Raise 5
MsgBox var
Increment = var + 1
End Function
In fact, except wotking with variables, the exported Functions will always crash if another COM function or even another API function is called but only when the client is VBA not VB !
I would appreciate if you could share your knowledge of this kind of stuff and shade some light on this to see if/how this could be worked around.
Regards.
21 mai 2011 à 20:05
Si tu utilises une fonction DllMain avec cette astuce tu vas faire sauter l'initialisation de la VBVM ce qui va rendre ton programme très instable. Cela pourrait tout de même marcher si tu évite tout appel a la VM. Par exemple si tu manipule une chaîne de caractère tu vas avoir droit a un beau seg fault car VB doit initialiser la VM avant de faire quoi que ce soit d'autre.
21 mai 2011 à 18:13
Check the 3 pages.
21 mai 2011 à 18:00
Sometime ago, I read somewhere about using a trick to make a VB dll behave like a Windows dll so one could call the VB dll from the Client Program just like a normal dlls ie: Using the "Declare Function xxxx Lib..." calling convention.
Would that solve the problem ?
I'll do a google search and post the link here if I find it (Maybe you already know about this trick ).
As for using C or ASM dll ,as suggested, I don't have the slightest idea about writing code in those two languages.
21 mai 2011 à 16:40
A solution is to use another C or Asm dll that create a new instance of the vb class.
On ne peut pas lancer une dll activex comme on le fait pour une dll classique car vb attend que le programme hote crée une nouvelle instance de la classe pour initialiser la vm. Une solution serait de créer une autre dll en C ou asm pour instancier la classe vb avec CoCreateObject.
21 mai 2011 à 16:33
Will this work for ActiveX dlls created in VB6 ?
I have given it a shot by assigning the ActiveX dll PathName to the FileName Const but the ActiveX dll Class Initialize event never gets fired.
15 sept. 2008 à 09:09
15 sept. 2008 à 00:38
Par contre quand tu dis : "un seul hook par app", c'est que tu peux faire un seul hook en tout, ou un seul hook par processus externe au tiens.
(ma question c'est est-ce que je peux sous-classer plusieurs fenetres de plusieurs processus avec ce code ?)
et sinon est-ce possible ?
merci
MadMatt
27 déc. 2006 à 16:08
WindowProc = DefWindowProc(hWnd, uMsg, wParam, lParam)
par quelque chose du genre :
If uMsg = WM_CLOSE Then
WindowProc = DefWindowProc(hWnd, 0, 0, 0)
Else
WindowProc = DefWindowProc(hWnd, uMsg, wParam, lParam)
End If
27 déc. 2006 à 16:02
27 déc. 2006 à 15:53
Cela dit j'ai observé une appli à l'aide de SPY++ et je n'ai pas vu WM_CLOSE mais seulement WM_DESTROY lors de la fermeture de l'appli.
Faut que je revoit ça...
Sinon, saurais-tu comment bloquer ce fameux message une fois qu'il est intercepté ?
Merci d'avance
++
27 déc. 2006 à 15:34
27 déc. 2006 à 15:26
J'ai un peu la même question que loulou06.
Comment faire pour bloquer certains messages (ex: WM_DESTROY)
Merci d'avance
++
19 août 2006 à 07:13
Au passage total RESPECT a cette DLL, de la grande classe .... :-)
L'equipe qui tue Renfield/Ebart
Dans la WindowProc (DLL), je voudrais detourner et ainsi bloquer certains messages
mais ca ne marcha pas, une idee ? Merci d'avance (reponse en pv please)
Function WindowProc(ByVal hWnd As Long, ByVal umsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim mVar As HookSubCls
Dim mData As MyStruct
Select Case umsg
Case WM_SVRCALL
ReadStruct wParam, lParam, mData
For Each mVar In m_Objects
If mVar.hWnd = hWnd Then
mVar.CallBack mData.hWnd, mData.umsg, mData.wParam, mData.lParam
Exit For
End If
Next
'Case 123:
Case Else
If umsg = m_MsgToSuspend Then
'' Dans mon cas: m_MsgToSuspend = 123 / WM_CONTEXTMENU
''#########################################################
WindowProc = 0
Else
WindowProc = DefWindowProc(hWnd, umsg, wParam, lParam)
End If
End Select
19 avril 2005 à 12:50
pour t'en assurer, tu peux utiliser Spy++ et essayer de capturer un de tes boutons...
18 avril 2005 à 21:41
J'ai essayer ta solution, elle marche partout et sous Vb non compile mais pas dans labview, dommage. Ton programme reconnait un seul handle sur le programme labview alors qu'il y a 6 boutons, 2 boutons options et des labels...c'est pas grave mais si quelqu'un a une solution.
Metalcoder
18 avril 2005 à 20:32
Private Declare Function WindowFromPoint Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (ByRef David As Point) As Long
Private Type Point
x As Long
y As Long
End Type
Private Sub Timer1_Timer()
Dim mypoint As Point
Dim thandle As Long
GetCursorPos mypoint
thandle = WindowFromPoint(mypoint.x, mypoint.y)
Me.Caption = thandle
End Sub
Ca te donne le handle du controle même un bouton
20 janv. 2005 à 07:50
A titre d'exemple car je pense que le probleme est le meme que le mien. lancer Vb, faite un bouton sur la fenetre et essayer de trouvé le handle du bouton avec les utilitaires comme spy++...si qqun y arrive ce serait cool
metalcoder
16 oct. 2004 à 17:50
Serait - il possible d'ajouter un bouton ou tout autre contole dans l'appli ?
25 sept. 2004 à 16:23
25 sept. 2004 à 16:18
quelle manifestation as tu du "ca ne fonctionne pas". Qu'essaies tu de faire exactement.... bref, donne nous quelques indices...
au boulot, j'ai NT4, et chez moi Xp.... (et les deux fonctionnent)
25 sept. 2004 à 15:53
25 sept. 2004 à 15:50
25 sept. 2004 à 15:47
je m'en sers pour une appli que l'on a au boulot, et ca fonctionne très bien, donc....
25 sept. 2004 à 15:43
21 sept. 2004 à 22:47
@+
21 sept. 2004 à 21:05
dis en plus sur ta config...
21 sept. 2004 à 20:58
22 août 2004 à 16:33
20 août 2004 à 18:10
12 mai 2004 à 09:58
12 févr. 2004 à 21:20
Source excellente qui utilise plein de points avancés de la programmation que j'aime bien :)
10/10 pour remonter la note... certains n'ont pas dû capter l'intérêt de la source...
4 févr. 2004 à 07:42
la faudra m'expliquer comment tu fait alors...
sans fenetre pas de WindowProc donc pas de sous classement !
de plus les labels dans les appli VB ce n'est rien d'autre qu'un appel
a DrawText (donc un dessin) donc tu n'es pas pres de le sous
classer a moin de trouver les points d'entré des fonctions ActiveX
@+
4 févr. 2004 à 06:01
foutus controles windowless ...
une idée de comment vb fait ?
15 janv. 2004 à 13:36
Le probleme, c'est que mes collegues et moi, passons 70% de notre temps là dessus...
Ce matin je me suis amusé (oui oui, ca m'amuse) a faire une sort de daemon qui rectifierait un peu la chose....
Et je me suis apercu rapdement que sans hook sur cette application, je ne pourrais pas faire grand chose ;)
J'ai donc telechargé ton source, qui m'epate par la quantité de choses qu'il contient ! Kalistor a raison, tu connais bien Win32 !!
15 janv. 2004 à 11:13
(assembleur x86) elle n'est pas vraiment au point mais
elle est suffisante pour notre exemple voici le code :
;#########################################################################
.386
.model flat, stdcall
option casemap :none
;#########################################################################
include D:\1_MANU\DOC~2.PRO\DOCUME~1\MASM32\include\windows.inc
include D:\1_MANU\DOC~2.PRO\DOCUME~1\MASM32\include\user32.inc
include D:\1_MANU\DOC~2.PRO\DOCUME~1\MASM32\include\kernel32.inc
includelib D:\1_MANU\DOC~2.PRO\DOCUME~1\MASM32\lib\user32.lib
includelib D:\1_MANU\DOC~2.PRO\DOCUME~1\MASM32\lib\kernel32.lib
;#########################################################################
HookProc proto :DWORD,:DWORD,:DWORD,:DWORD
ThreadProc proto :DWORD
;#########################################################################
Version equ 201h
MW_WNDPROC equ 410h
MW_WNDHOOK equ 420h
MW_WNDUNHK equ 430h
MW_PING equ 4FFh
;#########################################################################
MY_STRUCT STRUCT
hWnd DD ?
uMsg DD ?
wParam DD ?
lParam DD ?
MY_STRUCT ENDS
;#########################################################################
.data
Msg1 db "Window Hooked" ,0
Msg2 db "Window Unhooked" ,0
Msg3 db "Message" ,0
Msg4 db "#Library Loaded" ,0
Msg5 db "#Library Unloaded" ,0
Template db "%d" ,0
ClassName db "@6912345669@" ,0
AppName db "@6912345669@" ,0
hInstance HINSTANCE ?
CommandLine LPSTR ?
hHook dd ?
hwnd HWND ?
handle dd ?
hPID dd ?
lProc dd ?
lhWnd dd ?
lRetn dd ?
;#########################################################################
.code
LibMain proc hInstDLL:DWORD, reason:DWORD, unused:DWORD
.if reason == DLL_PROCESS_ATTACH
;==========================================
;invoke MessageBox,NULL,addr Msg4,NULL,MB_OK
;==========================================
invoke GetCurrentProcessId
mov hPID,eax
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke CreateThread,NULL,0,ThreadProc,NULL,0,NULL
mov handle,eax
.elseif reason == DLL_PROCESS_DETACH
;==========================================
;invoke MessageBox,NULL,addr Msg5,NULL,MB_OK
;==========================================
invoke DestroyWindow,hwnd
invoke CloseHandle,handle
.endif
mov eax,1
ret
LibMain Endp
GetVersion proc
mov eax,Version
ret
GetVersion endp
ThreadProc proc lpParameter:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,NULL ;COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
mov wc.hIcon,NULL ;eax
mov wc.hIconSm,NULL ;eax
mov wc.hCursor,NULL ;eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,0,0,0,0,0,NULL,NULL,hInstance,NULL
mov hwnd,eax
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0 ; get each message
cmp eax, 0 ; exit if GetMessage()
je ExitLoop ; returns zero
invoke TranslateMessage, ADDR msg ; translate it
invoke DispatchMessage, ADDR msg ; send it to message proc
jmp StartLoop
ExitLoop:
mov eax,msg.wParam
ret
ThreadProc endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL buffer[128]:byte
.if uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
.elseif uMsg == MW_PING
mov eax,1
ret
.elseif uMsg == MW_WNDPROC
invoke GetWindowLong,wParam,GWL_WNDPROC
mov hHook,eax
ret
.elseif uMsg == MW_WNDHOOK
;.if lProc == 0
;===========================================================
;invoke MessageBox,NULL,addr Msg1,NULL,MB_OK
;===========================================================
mov eax,lParam
mov lRetn,eax
mov eax,wParam
mov lhWnd,eax
;===========================================================
;invoke wsprintf,addr buffer,addr Template,lRetn
;invoke MessageBox,NULL,addr buffer,NULL,MB_OK
;===========================================================
invoke GetWindowLong,wParam,GWL_WNDPROC
mov lProc,eax
invoke SetWindowLong,wParam,GWL_WNDPROC,addr HookProc
;.else
; xor eax,eax
;.endif
ret
.elseif uMsg == MW_WNDUNHK
;.if lProc == 0
; xor eax,eax
;.else
;===========================================================
;invoke MessageBox,NULL,addr Msg2,NULL,MB_OK
;===========================================================
invoke SetWindowLong,lhWnd,GWL_WNDPROC,lProc
mov eax,1
;.endif
ret
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
HookProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
invoke CallWindowProc,lProc,hWnd,uMsg,wParam,lParam
;--------------------------------------------------
ret
HookProc endp
End LibMain
Pour ce qui est de la livrer sous forme de data c'est un choix purement personnel car j'ai horreur de trimballer plein de
dll, ocx etc.. donc la je suis au moin sur de sa presence
@+
15 janv. 2004 à 10:22
Juste une remarque : je n'ai pas trouvé le code de la DLL injectée (EBSCLS32.DLL) Ou bien je ne l'ai pas vu ?
Et une question : pourquoi livrer cette DLL sous forme de DATA dans un fichier ressource ? c'était pas plus simple de nous livrer directement la dll ?
Sinon, merci pour ce bout de code, il est tres interessant.
PS : si tu pouvais publier le code de EBSCLS32 ce serait bien !
14 janv. 2004 à 17:46
j'ai quand meme une grosse chute de tension la ... ouf
je pond que des daubes en ce moment !
BruNews>Aller demain je me met a .NET ! Naaaaan je rigole
Afyn> J'ai debuté avec le GFA Basic sur 1040 ! lol ;-)
(ça fait plein de point commun mine de rien)
J'ai bien reçu ton ZIP et j'en suis encore tout chambouler
je trouve ton interface midi avec la grille et les accord de
gratte terrible !
Mais je me suis pas encore attaqué au code si tu veus
que je regarde un point precis envoi moi un msg
@+
14 janv. 2004 à 17:37
Savez tu Mister EB que le petit symbole /|\ que tu utilises parfois est le symbole d'ATARI ?
Noblesse oblige de rendre aux anciens les merveilles dont ils nous ont fait hériter (encore un terme informatique).
(PS tu as reçu mon ZIP?)
A+
Afyn - NAVEDAC
14 janv. 2004 à 15:18
14 janv. 2004 à 08:39
Bien que n'ayant pas eu le loisir de telecharger encore le Zip, je suis sur que l'on se trouve fasse à du travail de qualité.
Cela peut permettre pas mal de choses, mais bon, encore faut-il avoir ne serais-ce qu'une idée de ce qu'est le SubClassing...
Cela peut être notament utile pour tout ce qui est KeyLogger.... (on en vois pas mal par moments sur le site).
14 janv. 2004 à 08:20
fois pourtant je telecharge tjrs ma source pour tester et ça avais
bien marché... bizzard ?
Quand à l'interet de la source... je cros que c'est tellement
evident que des fois je me demande bien a qui je m'adresse...
bref on a peut etre pas les memes centres d'interet
@+
14 janv. 2004 à 08:18
14 janv. 2004 à 02:53
14 janv. 2004 à 01:06
14 janv. 2004 à 00:43