ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Technique de débogage de composants COM VFP   



L'auteur

Thierry
France France
Membre Simple
# 0000000016
enregistré le 13/10/2004

50 ans
PERRETIER Thierry
92800 PUTEAUX
Fiche personnelle


Note des membres
20/20
2 votes


Contributions > 60 - AtoutFox > 90 - Articles AtoutFox

Technique de débogage de composants COM VFP
# 0000000117
ajouté le 04/12/2004 14:50:12 et modifié le 13/09/2006
consulté 7732 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 :

        o=CreateObject("Serveur.classe")
        resultat = o.methode("paramètre")
     
  • 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)

 

Code source :
****** SERVEUR (Serveur.prg->RemoteFox.DLL) *******

#DEFINE PRG_SERVEUR "c:\thierry\RemoteFox\Serveur.prg"

DEFINE CLASS serveur AS Session OLEPUBLIC

DIMENSION aTab(1)

PROCEDURE init
    SET DELETED ON
    SET COLLATE TO "Machine"
ENDPROC

FUNCTION GetDebugObject() as Object
    LOCAL oVfp
    oVfp = GetObject(,"VisualFoxpro.application")
    RETURN oVfp.Eval([NewObject("serveur",PRG_SERVEUR)])
ENDFUNC

FUNCTION EVAL(cExpr as Stringas Variant
    RETURN evaluate(m.cExpr)
ENDFUNC

PROCEDURE DOCMD(cCmd as String)
    &cCmd
ENDPROC

FUNCTION returnXML() as string
    LOCAL cXml
    CURSORTOXML(Alias(),"cXml",1,0,0,"1")
    RETURN m.cXml
ENDFUNC

FUNCTION GetStruct() as array
    AFields(this.aTab)
    RETURN @this.aTab
ENDPROC

FUNCTION GetDatas() as array
    dimension this.aTab(Reccount(),Fcount())
    COPY TO array this.aTab
    RETURN @this.aTab
ENDPROC

ENDDEFINE

**** CLIENT ****

#DEFINE _DEBUG .T.

CLOSE DATABASES all
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")

PRIVATE aStruct, aDatas
aStruct = o.GetStruct()
aDatas = o.GetDatas()
CREATE CURSOR result2 FROM ARRAY aStruct
INSERT INTO result2 FROM ARRAY aDatas
GO top
BROWSE

Commentaires
le 20/01/2007, Jean_BRUN a écrit :
C'est vraiment génial.
Tout ce temps passé à debugger des Com en aveugle !!
Que la lumière soit.
Bravo


www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2021.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3