Technique de débogage de composants COM VFP
# 0000000117
ajouté le 04/12/2004 14:50:12 et modifié le 13/09/2006
consulté 9923 fois
Niveau
expert
Version(s) Foxpro : VFP 9.0 VFP 8.0 VFP 7.0
Description
Vérification de votre Configuration :
Fermer VFP
Lancer la version de VFP avec laquelle vous avez écrit votre composant COM
Lancer les commandes suivantes: o=GetObject(,"VisualFoxpro.application") o.DoCmd("? 1")
La commande GetObject doit fonctionner et "1" doit s'afficher, sinon utiliser l'invite de commande (CMD.EXE) et lancer la commande suivante dans le dossier d'installation de VFP (par exemple version 8) : VFP8.EXE /REGSERVER. Une autre solution consiste à changer le "ProgId" en fonction de la version de VFP utilisée, par exemple "VisualFoxpro.application.8" ou "Visual.Foxpro.Application.7"
Noter bien que la première session de VFP servira à déboguer le serveur. Une seconde session servira au débogage du client.
Principe de fonctionnement de la technique de déboguage.
Sans fermer la première session de l'IDE VFP lancé précédemment, lancer une seconde fois VFP. Celle ci sera réservé au débogage du client.
Normalement, le client appelle le composant de cette manière :
L'idée est que, tout en continuant à utilisant la technique COM, à substituer l'objet contenu dans la DLL par un objet créé dans l'autre environnement de développement de VFP
oVfp=GetObject(,"VisualFoxpro.application") oVfp.DoCmd([? 2 ]) && -> noter que '2' s'affichera bien sur l'autre VFP.
o = oVfp.eval( [ NewObject("classe","source.prg") ] ) resultat = o.methode("paramètre")
Avec cette technique, vous pouvez en utilisant l'IDE de VFP, gérer manuellement les erreurs (suspend, resume...), poser des points d'arrêts, utiliser le débogueur...
Ce système fonctionne également pour d'autre langages que Foxpro en tant que client du composant VFP.
Il fonctionne avec un composant COM/COM+/DCOM. Un composant distant peut être débogué : VFP sur la machine serveur pour déboguer le composant serveur, VFP sur la machine cliente pour déboguer le client. (utiliser un outil de contrôle à distance)
Exemple
La différence par rapport à l'explication précédente vient de la méthode suivante qui a été intégré au composant :
FUNCTION GetDebugObject() as Object LOCAL oVfp oVfp = GetObject(,"VisualFoxpro.application") RETURN oVfp.Eval([NewObject("serveur",PRG_SERVEUR)]) ENDFUNC
Le client lance alors le composant en mode débogage de la façon suivante : oRemote=CreateObject("RemoteFox.Serveur") oRemote=oRemote.GetDebugObject()
Il n'y a qu'une instruction à ajouter pour être en mode débogage.
La liaison à la DLL est alors remplacée par une liaison à l'objet créé dans VisualFoxpro.application. (NB : Il faudra éviter l'utilisation de l' "early (VTable) binding" et le typage fort des variables objets dans des langages comme C++ ou C# )
L'exemple est également une démonstration de 2 modes de transmission d'un curseur du serveur au client : XML et tableaux. A noter que la solution tableau ne fonctionne pas avec les curseurs contenant des champs Mémo (à cause de COPY TO ARRAY)
FUNCTION GetDebugObject() as Object LOCAL oVfp
oVfp = GetObject(,"VisualFoxpro.application") RETURN oVfp.Eval([NewObject("serveur",PRG_SERVEUR)]) ENDFUNC
FUNCTION EVAL(cExpr asString) as Variant RETURNevaluate(m.cExpr) ENDFUNC
PROCEDUREDOCMD(cCmd asString)
&cCmd ENDPROC
FUNCTION returnXML() asstring LOCAL cXml CURSORTOXML(Alias(),"cXml",1,0,0,"1") RETURN m.cXml ENDFUNC
FUNCTION GetStruct() asarray AFields(this.aTab) RETURN @this.aTab ENDPROC
FUNCTION GetDatas() asarray dimensionthis.aTab(Reccount(),Fcount()) COPYTOarraythis.aTab RETURN @this.aTab ENDPROC
ENDDEFINE
**** CLIENT ****
#DEFINE _DEBUG .T.
CLOSEDATABASESall
o=CreateObjectEX("RemoteFox.Serveur","192.168.0.1")
#IF _DEBUG
o=o.GetDebugObject()
#ENDIF
o.doCmd("open database c:\vfp8\samples\northwind\northwind.dbc")
o.doCmd("select * from customers into cursor c1") XMLToCursor(o.ReturnXml(),"result")
C'est vraiment génial.
Tout ce temps passé à debugger des Com en aveugle !!
Que la lumière soit.
Bravo