begin process at 2008 08 21 05:32:06
1 229 224 membres
55 nouveaux aujourd'hui
14 260 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

VISUAL C++ .NET 2005: DES POINTS OBSCURS EXPLIQUES


Information sur le tutorial

Catégorie :.Net Tutorial .NET ( DotNet ) Date de création : 06/05/2007 13:18:12 Vu : 11 219 fois

Note :
Aucune note

Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

Description

Ce tutorial a pour objectif de vous expliquer des points obscurs qui ne sont pas ( ou peu) expliqués ailleurs. Je voudrais vous aider sur des questions qui m'ont posé problème. Ce tutorial sera complété au fûr et à mesure.

Tutorial

SOMMAIRE

I) GENERALITES

I.1) Les applications windows form

I.2) les applications MFC

I.3) Objets managés et objets non managés - généralités

I.4) Les objets non managés

I.5) Les objets managés - Les handles

I.6) L'opérateur top-level: ^

II) CREER SES PROPRES EVENEMENTS EN C++ .NET

II.1) Rappel sur les procédures liées( aux évènements)

II.2) La procédure à suivre pour créer ses évènements

COURS VISUAL C++ 2005 .NET

I) GENERALITES

 Ce cours n'est pas complet. Je préciserai des points utiles à savoir du langage VISUAL C++ 2005.
  Je vous conseille, avant d'aborder le langage C++ 2005, de commencer par le visual Basic 2005, ou encore par le C# 2005. Ainsi, vous pourrez comprendre toutes les notions de la programmation orientée objet, sans vous encombrer trop avec des préoccupations de bas niveau.

I.1) Les applications windows form

  Le Visual C++ 2005 est capable de créer des applications windows. Il utilise pour cela les windows forms. C'est un des moyens, le dernier, pour parvenir à créer une application windows.
  Les applications Windows Forms sont des applications managées. Elles le sont par le Framework 2.0 . Les objets créés dans une application WinForm sont managés eux aussi par le Framework. Ce qui a pour avantage énorme d'être détruits automatiquement par le garbage collector, quand ils ne sont plus référencés. Et tout en gardant la possibilité de les détruire par nous-même, avec la fonction delete.

I.2) les applications MFC

  Cependant, il existe d'autres moyens, plus anciens, comme les MFC( Microsoft Foundation Classes). Ce sont des classes fournies par Microsoft, qui permettent de créer des applications windows. L'application ainsi produite sera appelée application MFC. Les MFC étaient fournies avec Visual C++ 6.0. Elles sont encore disponibles dans visual studio 2005, mais pas dans la version express. La personne qui ne dispose que de visual studio express, ne peut donc pas utiliser les MFC, ce qui est un gros problème des MFC.
  Les applications MFC sont intégrables simultanément dans des applications windows forms.

  Les applications MFC ne sont pas managées par le Framework .Net, au contraire des winforms. Les objets créés ne seront par conséquent pas managés. Le garbage collector ne les détruira donc pas. Et vous devrez donc les éliminer vous-même, avec le risque bien connu de remplissage de la mémoire( si vous oubliez de les libérer).  

I.3) Objets managés et objets non managés - généralités

  Les objets créés dynamiquement en visual c++ 2005 .net sont des objets managés par le .net framework. Il est possible toutefois de créer des objets non managés, comme les allocations classiques en C. Dans ce cas, on ne fait plus du .net!

  L'avantage des objets managés, c'est qu'ils sont détruits par le garbage collector, sans que l'on ait à s'en préoccuper. Par contre, les objets non managés doivent être détruit "manuellement".

I.4) Les objets non managés

  Rappelons d'abord que les objets non managés ne sont plus du .net.
  Pour créer des objets non managés, on utilise le new classique:
  personne* Jean = new personne( );
 Un objet de la classe personne est ici alloué dans la mémoire. Jean contient l'adresse en mémoire de cet objet.

L'objet lui-même, c'est la valeur pointée par Jean. L'objet, c'est *Jean . Le champs age de Jean, c'est *Jean.age, ou encore Jean->age

I.5) Les objets managés - Les handles

  Voici le cas qui nous intéresse.
  Un objet managé est créé dans le tas( heap) du framework. Alors que les objets non managés sont créés dans la mémoire. Bien entendu, le tas est situé dans une partie de la mémoire. Mais c'est une partie de la mémoire, appelée tas( heap en anglais), qui est réservée pour le .net framework, au même titre que la pile pour l'exécution.

  Pour désigner où se trouve un objet managé, on n'utilise non pas son adresse en mémoire, mais un handle. Le handle est un identifiant qui permet de désigner l'objet de manière unique. C'est juste une autre manière de référencer l'objet. On ne parlera plus d'adresses pour les références d'objets managés.

I.6) L'opérateur top-level: ^

  Pour créer des objets managés, on utilise gcnew, et non pas new. Exemple:
personne^ Jean = gcnew personne( );

Jean est une référence sur un objet de la classe personne. C'est le handle de l'objet managé.

  Pour les objets .net, on utilise donc l'opérateur ^, et non pas * .

  Pour accéder aux membres de l'objet, on écrit:

Jean->age . Car Jean étant une référence sur un objet personne, on ne peut pas écrire Jean.personne. Jean->age signifie: l'attribut age de l'objet pointé par Jean.

II) CREER SES PROPRES EVENEMENTS EN C++ .NET

  Il est bon de savoir créer ses propres évènements, afin de pouvoir faire sa propre programmation évènementielle.
  Il est possible de réaliser cela en C++ .net, mais aussi en C# et en Visual Basic .net . Voici les différentes étapes à suivre.
  Prenons l'exemple d'une classe voiture, qui crée des objets voiture. On veut pouvoir disposer d'un évènement FREINE, qu'on déclenchera au freinage d'une voiture.

II.1) Rappel sur les procédures liées( aux évènements)

  On peut observer très facilement, par rapport aux lignes générées automatiquement par visual studio en cas d'évènement windows, que la procédure liée est de la forme suivante

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { }

De plus, le code suivant est auto-généré lui-aussi, dans la fonction initializecomponent( ) :

this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);

Cette ligne permet de lier la fonction button1_Click à l'évenement Click du bouton 1. Nous l'expliquerons plus en détail bientôt.

Revenons à la ligne précédente:

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { }

Ceci est donc une fonction qui sera appelée en cas de click sur le bouton1. Cette fonction possède deux paramètres.

  - sender, qui est un objet( en fait une référence sur l'objet, bien sûr, mais je dis que c'est un objet pour simplifier; en réalité on devrait l'appeler handle_sender). sender est l'objet qui a émis l'évènement. L'émetteur de l'évènement peut y mettre ce qu'il veut. C'est juste une information pour la fonction liée, pour la renseigner. Ici, le sender est l'objet button1, donc on n'a pas l'impression que ce paramètre est utile. Mais parfois, il est nécessaire. Par exemple, dans notre cas, on pourrait y mettre la référence de la voiture qui freine.

  - L'argument e est un objet, qui encapsule toutes les informations intéressantes concernant l'évènement. Par exemple, dans le cas d'un appui sur une touche, le code de la touche pressée.
Dans notre cas, cela peut être les circonstances au moment du freinage( pluie, soleil, etc), la vitesse au moment de freiner, etc.
Cet argument doit forcément être d'une classe dérivée de la classe System::EventArgs . Par exemple, dans le cas de l'évènement KeyDown:

private: System::Void Form1_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) { }

Le e ici est de la classe KeyEventArgs, qui est une classe qui hérite de la classe EventArgs. La classe KeyEventArgs est spécialement adaptée pour cet évènement. Elle possède notamment un attribut e->KeyCode, qui est le code de la touche pressée. Ce KeyCode ne figure pas, par contre, dans la classe EventArgs. Cet objet e est là pour aider la fonction liée. Pour lui donner des informations que l'évènement KeyDown seul, ne suffit pas à donner( il nous indique juste qu'une touche a été enfoncée). Le e est donc nécessaire.

II.2) La procédure à suivre pour créer ses évènements

  Pour créer ses propres évènements, la façon de procéder est composée de plusieurs parties.

- Créer sa propre classe EventArgs
- Se créer une classe EmetEvent, qui permettra de créer un objet émetteur d'évènements.
- Procéder à quelques déclarations et initialisations, à l'extérieur, par exemple dans la classe Form1( votre classe de formulaire principal). Par exemple se créer un objet émetteur d'évènements.

  Nous étudierons un exemple complet, celui des objets voiture et de l'évènement FREINE.

II.2.1) Créer sa propre classe EventArgs

  Nous devons tout d'abord nous créer notre propre classe EventArgs, qui tient compte des particularités de notre évènement.

namespace CreerEventCpp {

   using namespace System;

   public ref class VoitEventArgs : public System::EventArgs {

      public: String^ type_freinage; //pluie, etc
      public: int vitesse_fr; //vitesse au moment de freiner
      public: VoitEventArgs( ) { }
      public: VoitEventArgs( String^ type_fr ) {
         this->type_freinage = type_fr;
      }

   }; //fin classe
} //fin namespace

  Notre classe VoitEventArgs hérite de la classe System::EventArgs, bien sûr.

  Puis nous avons les 2 propriétés type_freinage et vitesse_fr, qui vont donner au programmeur des renseignements sur l'évènement FREINE. Enfin nous avons 2 constructeurs de la classe. L'objet e nous concernant sera donc une instanciation de la classe VoitEventArgs.

II.2.2) Créer une classe EmetEvent

  Cette classe servira à créer un objet émetteur d'évènement. Cet objet sera utilisé pour émettre l'évènement FREINE. Et un de ses membres sera un event FREINE.
  On ne peut émettre des évènements qu'à partir de la classe qui contient le membre event. C'est pour cela que pour émettre des évènements FREINE, nous prévoirons des méthodes à l'intérieur de l'objet émetteur d'évènements. Ainsi la méthode emet_freine_pluie émet un évènement FREINE, avec un e->type_freinage à "pluie".
On pourra appeler cet méthode de n'importe où, donc émettre des évènements de n'importe où.

  Le constructeur de EmetEvent commence par créer un objet e_voit( une des propriétés de EmetEvent).

  VoitEventHandler est en réalité une classe qui hérite de la classe System::EventHandler . Les objets EventHandler contiennent les adresses des fonctions liées aux évènements. Ainsi le framework saura quelles méthodes appeler dans le cas du déclenchement de l'évènement.
Les fonctions liées mises dans les objets de la classe EventHandler doivent avoir obligatoirement 2 paramètres: un sender de type object, et un objet e d'une classe dérivée de la classe EventsArgs. Et ces fonctions ne doivent rien retourner( void).

Cependant, le VoitEventHandler est déclaré dans la classe comme une fonction "déléguée". Et on fait une sorte de déclaration de son prototype. Cette notion de déléguée est juste une vue de l'esprit, pour simplifier les choses. VoitEventHandler n'est pas une fonction en réalité, mais un objet( quand la classe sera instanciée) contenant toutes les adresses des fonctions liées. On peut voir VoitEventHandler comme UNE fonction déléguée, représentant toutes les fonctions liées. Et on déclare ainsi le prototype de cette fonction déléguée. Grâce à cet déclaration de prototype, le framework saura le prototype de toutes les fonctions liées( qui auront toutes ce prototype).
Je vous conseille de voir l'objet de la classe VoitEventHandler comme un objet de la classe System::EventHandler( un 'traiteur' d'évènements ); et de ne pas voir VoitEventHandler comme une fonction, car ce n'en est pas une. D'ailleurs les membres event, tel FREINE, sont déclarés comme des objets de la classe EventHandler( dans notre cas de la classe VoitEventHandler).

  On déclare ensuite un membre event. Event n'est pas un type, c'est un genre de membre. Il y a les attributs, les méthodes, et les events! . On appelle cet event: FREINE. Cet event est un objet de la classe VoitEventHandler. Ainsi, un évènement, est juste un objet traiteur d'évènements, qui contient les références de toutes les fonctions liées. Ce qui est logique.

  Enfin, on se prévoit des méthodes, telles emet_freine_pluie, qui sauront capables d'émettre des évènements de n'importe où dans notre programme. Et avec un objet e rempli d'une manière qui nous arrange. Emet_freine_pluie, par exemple, non seulement émet un évènement FREINE, mais en plus fournit un e avec le champ e.type_freinage = "pluie". On pourra appeler par exemple emet_freine_pluie à partir de la form1!

#include"VoitEventArgs.h"

namespace CreerEventCpp {

  ref class EmetEvent {

    private: VoitEventArgs^ e_voit;

    public: EmetEvent( ) {

      this->e_voit = gcnew VoitEventArgs( ); }

    public: delegate void VoitEventHandler System::Object^ sender, VoitEventArgs^ e );

    public: event VoitEventHandler^ FREINE;

    public: void emet_freine_pluie( System::Object^ sender){

     this->e_voit->type_freinage = L"pluie"; this->FREINE( sender, this->e_voit ); }

  }; //Fin classe

//Fin namespace

II.2.3) Les déclarations à l'extérieur

- Se créer un objet émetteur d'évènement, de la classe EmetEvent, par exemple comme attribut de la classe Form1. Ne pas oublier d'ajouter #include "EmetEvent.h" dans form1.h( ou dans votre fichier si ce c'est pas form1.h).

public EmetEvent^ Emetteur_Voit

Puis, dans le form1_load(ou autre):

this->Emetteur_voit = gcnew EmetEvent();

- Dans le form1_load, par exemple, ajouter notre évènement à notre objet de la classe VoitEventHandler

this->Emetteur_voit->FREINE += gcnew EmetEvent::VoitEventHandler( this, &Form1::ma_fct_liee);

  Ceci se fait avec une syntaxe spécial( "+=" ), qui a un sens particulier ici. On "ajoute" à notre membre FREINE, qui est un objet VoitEventHandler, un nouvel objet VoitEventHandler. Ce nouvel objet est initialisé avec un constructeur à 2 paramètres: le premier est l'objet contenant la fonction liée. Mettez, par exemple, "this", si vous êtes dans la classe form1, et que votre fonction liée s'y trouve.
  Le second paramètre est l'adresse de la fonction liée, c'est donc un pointeur de fonction.
Tout ceci est une syntaxe spéciale, que visual studio comprendra, et il comprendra que vous voulez ajouter cet fonction à votre objet VoitEventHandler. Vous pouvez ajouter, de cette manière, autant de fonctions liées que vous le souhaitez. Et vous pouvez aussi utiliser le "-=" pour en retirer.
Remarque: cette syntaxe est utilisée dans les lignes auto-générées par visual studio dans la classe form1, dans la méthode initializecomponent, pour lier vos fonctions aux évènements windows( par exemple votre fonction button1_click).

- Ensuite, on peut déclencher les évènements comme bon nous semble, en appelant les méthodes de la classe EmetEvent

this->Emetteur_voit->emet_freine_pluie(this);

le this en paramètre correspond au formulaire principal de la classe form1, dans mon exemple. On aurait pu mettre la référence de la voiture qui freine.

- Et bien sûr, il faut se faire ses procédures liées, exactement de la même manière que pour les évènements windows.

 void ma_fct_liee( System::Object^ sender, VoitEventArgs^ e ) {

  this->textBox1->Text = L"1 event FREINE emis. e.text:=' " + e->type_freinage + L" ' . sender: " + sender->ToString();
}

  • signaler à un administrateur
    Commentaire de darunia le 21/06/2007 14:04:26

    "Les MFC étaient fournies avec Visual C++ 6.0. Elles sont encore disponibles dans visual studio 2005, mais pas dans la version express. La personne qui ne dispose que de visual studio express, ne peut donc pas utiliser les MFC, ce qui est un gros problème des MFC." -> Rien ne t'empeche de les rajouter (comme le platform sdk)

    "Objets managés et objets non managés - généralités " -> le code managé implique le chargment du CLR, tu devrais en parler

    Il y a beaucoup trop de points, ça coupe les phrases alors que ce n'est pas utiles.
    De plus je trouve les explications un peu "obscures"
    Tu devrais plus insiter sur les performance et le CLR, .net n'est pas seulement une façon de coder !

  • signaler à un administrateur
    Commentaire de passdoor le 13/07/2007 18:45:58

    Je trouve l'approche concrète et les petits exemples clairs.
    reste à hésiter entre c#,C++ .net et non managé ou un mix.
    Bravo et n hesites pas à envoyer d autres doc, en tout cas moi je prends, encore merci.

  • signaler à un administrateur
    Commentaire de Abdelhamid750 le 30/09/2007 18:23:16

    je voudrais le cous en pdf SVP

  • signaler à un administrateur
    Commentaire de tirole le 30/09/2007 18:57:48

    Salut Passdoor, j'ai vu ton commentaire maintenant. Je voudrais te remercier de m'encourager. J'ai mis des tutos aussi sur c# .net, vb .net et asp .net.

  • signaler à un administrateur
    Commentaire de tirole le 30/09/2007 19:02:14

    Bonjour AbdelHamid . Le cours n'existe pas en pdf pour l'instant. Mais tu peux le retrouver sur mon site www.infkoffler.com

  • signaler à un administrateur
    Commentaire de stb2680 le 12/12/2007 09:43:53

    Bonjour,
    Ton tutorial est très bien, mais ne repond pas à mon prb ... :(
    Je dois utiliser une DLL qui recoit en parametre un pointeur sur une structure "maison" :

    maFonctionDansDLL(int param1, struct MaStructure &m_structure);

    Comment je dois m'y prendre ??? Je ne sais pas faire une structure en C++ managé !

    Merci de ton aide.

  • signaler à un administrateur
    Commentaire de tirole le 12/12/2007 21:05:39

    Bonjour,

    il est vrai que je n'ai pas abordé les références natives ( le "&" dans un paramètre d'une fonction), et les références managées( le "%" dans les paramètres d'une fonction)(c'est du vocabulaire microsoft). Tout simplement parce que je ne connaissais pas cette notation!
    D'après ce que j'ai pu comprendre, c'est juste pour préciser que ton paramètre est un pointeur non-managé( dans le cas où tu es, qui est le cas de ton exemple), ou non managé( dans le cas du %). Mais je ne connais pas la différence avec l'écriture * dans un paramètre( qui me semble identique à &), et l'écriture ^dans un paramètre( qui me semble identique à %).
    Donc dans ton cas, ta fonction demande un pointeur sur une structure non managée. Donc tu ne dois pas travailler en managé( à moins qu'il existe un système de conversion des 2 types d'adresse).
    Et aussi, pour répondre à ta question, le c++ managé est identique au c++ classique, hormis que les objets sont alloués sur le tas. Donc les déclarations de structures managées sont comme d'habitude en c++.

  • signaler à un administrateur
    Commentaire de stb2680 le 13/12/2007 09:35:29

    Merci, effectivement, j'ai juste rajouté un "ref" devant et c'est passé !! :)

    Trop bien,
    merci encore.

  • signaler à un administrateur
    Commentaire de stb2680 le 13/12/2007 18:29:28

    Alors, je suis allé un peu vite en besogne :
    La declaration de la structure : OK,
    mais l'appel dans la DLL : NOK !!!

    il me dit qu'il ne peut pas convertir "maStructure" en "maStructure &" ... :'(
    En fait, la structure est declarée dans une autre classe, alors çà me donne qlq chose comme çà :
    maFonctionDansDLL(param1, class->maStructure);

    J'ai essayé de passer par 1 structure intermediaire, mais pas mieux :( ...
    J'ai essayé avec 1 pointeur sur une structure intermédaire, .... pas bon non plus.
    Et je ne sais pas comment lui dire que c'est pas du code managé.
    Est-ce que je peux affecter 1 structure d'1 classe managé à un pointeur non managé ?

  • signaler à un administrateur
    Commentaire de tirole le 13/12/2007 19:41:05

    D'abord une structure en c++, c'est exactement comme une classe. Elle se passe par référence, et pas par valeur( ce qui est le cas en c#).

    Ensuite, utiliser des objets managés comme paramètre à des méthodes qui demandent des objets non-managés, à priori, c'est pas possible, mais il y a peut-être un système prévu pour se sortir de ce cas. En tout cas, normalement, quand le code est non managé, on doit utiliser des pointeurs classiques non managés. Et pour des méthodes écrites vraiment pour le framework 2( donc objets managés), on doit utiliser normalement des objets managés.
    C'est aussi simple que ça.
    Maintenant, ta méthode est non managée, donc c'est surement une "vieille" méthode adaptée pour visual studio 2005. Dans ce cas, utilise des pointeurs classiques *.
    Soit ta déclaration de structure:
    struct nomStruct {
    ...
    }; //Tu viens juste de déclarer un nouveau type, qui est nomStruct

    Puis tu alloues une variable dynamiquement
    nomStruct *pointeurMaStruct = new nomStruct; //le new va allouer un objet en non-ménagé( dans la mémoire normale)

    Pour accéder aux champs de la structure:
    pointeurMaStruct->nomDuChamp

    Ici, ta méthode demande un pointeur sur une structure, donc tu passes juste pointeurMaStruct à ta méthode.

    Le fait que ta structure se trouve dans une classe( donc dans un objet au final) ne complexifie pas le problème.

    Tu passes pointeurTonObjet->pointeurMaStruct

    Que ton objet qui contient la structure soit managé ou non managé, à mon avis, ne pose pas de problème. Car tu passes tonObjet->pointeurMaStruct: il va chercher ton pointeur de structure dans ton objet, puis le passe. Donc ton appel de méthode est indépendant de ton objet contenant ta structure.

    Voilà ce que j'ai pu comprendre à ton problème, j'espère que j'ai bien compris ta question

  • signaler à un administrateur
    Commentaire de stb2680 le 17/12/2007 11:24:19

    Tu as tout bien compris, mais le compilateur est tres tatillon ...

    Il ne veut absolument pas mélangé managé et non managé. J'ai mis la structure en dehors de la classe, pas mieux.

    Je vais tenter ma chance avec la library Marshal->StructureToPtr, je verais bien.

    Ce qui me perturbe, c'est le fait de donner l'adresse, et non 1 pointeur ...

  • signaler à un administrateur
    Commentaire de tirole le 17/12/2007 19:14:20

    Dans "maFonctionDansDLL(int param1, struct MaStructure &m_structure); ", le "&" ici n'est pas le "&" habituel qui signifie "adresse de". C'est un & dans un paramètre qui signifie que ce paramètre est une référence non managée( le terme Microsoft est "référence native"). Ce "&" dans un paramètre est donc l'équivalent du "*". Rien à voir ici avec le "&" qui veut dire "adresse de".

    Donc, "maFonctionDansDLL(int param1, struct MaStructure &m_structure); " est équivalent à
    "maFonctionDansDLL(int param1, struct MaStructure *m_structure);".

    Et, si tu avais eu "maFonctionDansDLL(int param1, struct MaStructure %m_structure); ", cela aurait été équivalent à "maFonctionDansDLL(int param1, struct MaStructure ^m_structure); "".

    J'ai pas compris trop l'intérêt de "&" et "%" dans ce sens-là, car il peuvent être remplacé par "*" et "^".

    Quand j'aurais un peu de temps, je fairai des essais

  • signaler à un administrateur
    Commentaire de tirole le 17/12/2007 19:50:31

    J'ai cherché sur msdn. http://msdn2.microsoft.com/fr-fr/library/0szztey7(VS.80).aspx

    un lien qui explique comment appelé une fonction non managée, dans du code managée( même si cette fonction est dans une DLL). C'est compliqué mais possible.

    Moi je te conseille soit de faire( au moins au début) soit tout en non-managé, soit tout en managé. Donc si tu tiens à tout pris à utiliser ta dll non managée, écris ton programme aussi en non-managé!

    Pour ce qui est de la déclaration d'une structure managée, je suis en train de regarder, il faut peut-être rajouter quelque chose à la déclaration classique de structure, qui serait particulier à .net

  • signaler à un administrateur
    Commentaire de stb2680 le 18/12/2007 18:49:56

    Merci pour le lien, je vais essayer !!!

    Par contre, je crois que je n'ai pas bien compris :
    maFonctionDansDLL(int param1, struct MaStructure &m_structure);
    c'est en code non-managé, car çà fait parti du bout de code que j'ai recupéré.
    Donc en fait le &m_structure est bien un pointeur ???

    Mais comme je suis nul à souhait en Visual C++ 6 et meme en VS 2005 en non-managé ... je prefert passer un peu (meme bcp) de temps à chercher comment faire çà que d'apprendre les anciens language car ils sont trop long pour toute l'implémentation graphique et le rendu est pas terrible (mais ce n'est que mon avis:) )

    Perso, j'avais trouvé çà comme info, mais çà marche pas non plus ... je l'ai un peu adapté car c'est du C#:
    http://www.pcreview.co.uk/forums/thread-1352086.php

  • signaler à un administrateur
    Commentaire de darunia le 18/12/2007 19:11:37

    Si tu as la main sur cette Dll, je te conseil vivement de virer cette vilaine reference.
    Sinon, passer par du C++ .net peut etre une solution ...

  • signaler à un administrateur
    Commentaire de tirole le 18/12/2007 21:12:52

    réponse à stb2680
    t'as bien compris, le &m_structure est bien un pointeur. Voilà un lien vers msdn qui explicite cette écriture: http://msdn2.microsoft.com/fr-fr/library/bb727331.aspx( vers le milieu de la page web). Il y a donc une écriture " & " et " % " dans les paramètres des méthodes seulement, et qui est "la référence native (&) par la référence managée (Tracking reference) (%) "(citation msdn)

Ajouter un commentaire

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
extraction dinformatio...
Budget : 300€
campagne Adwords
Budget : 5 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Boutique

Boutique de goodies CodeS-SourceS