IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Initialiser un LPWORD


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Par défaut Initialiser un LPWORD
    Bonjour a tous,

    Cela fait un moment que je perds mon temps a essayer de debugguer ma DLL.
    En effet, je travail sur une dll qui implémente la norme hllapi (il n'est pas utile de savoir ce que c'est), le but final est que cette DLL puisse etre charge par mon programme Word qui contient une macro qui fait appel a une fonction exporter de cette dernière (la DLL). Seulement la macro est ecrite en VB et que lors du passage des parametres il se peut que celle-ci ne les initialise pas correctement, mais elle marche tres bien avec une précédente version de la DLL qui utilise du JNI (forcement puisque si elles ne sont pas initialise c'est java qui les initialise).
    Mon problème est que lors de l'appel a ma fonction exportée a travers la macro, il a quelques variables qui ne sont pas initialises. J'ai donc cherche a intercepte les variables non initialise en faisant un truc du genre:


    if((long)(value) == 0xcccccccc){
    int a = 0;
    int* mvalue;
    mvalue = &a;
    value= (LPWORD)mvalue;
    }

    La signature de ma fonction exporter est :
    #define HLLAPI_API __declspec(dllexport)
    HLLAPI_API long __stdcall hllapi(LPWORD function, LPSTR data, LPWORD length, LPWORD value)

    Mon souci c'est que l'affectation que je fais de ma variable ne marche pas. Et je n'ai trouve nul part comment initialiser le LPWORD value par exemple

    Donc si qqun veux bien m'aider...
    Merci

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Vu dans le SDK
    Donc LPWORD est un pointeur sur WORD (2 octets non signés)

    Je dirais donc que l'appelant déclare une variable de type WORD, l'initialise et passe l'adresse de cette variable lors de l'appel de la fonction hllapi().
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Par défaut
    Merci pour ta réponse ram_0000.
    En effet le LPWORD est un pointeur sur WORD. Le problème c'est que je n'ai pas la main sur la macro, et que je soupçonne la macro MS Word de ne pas initialise correctement les paramètres qui sont passes a ma fonction hllapi. Donc la question est de savoir si je peux modifier ou réinitialiser les pointeurs (les variables de ma fonction) dans ma fonction.
    un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    WORD var = 0;
    if (value est non initialisé)
        value = &var;
    Mais cela ne marche pas, puisque lorsque je debuggue en pas a pas avec VC++ 2003 (j'ai un programme qui load la DLL pour la tester), et bien l'affectation ne se fait pas .......

    Au fait en passant est-ce que qqun sait comment savoir si un pointeur a été initialise correctement et de façon sur car dans mon précédent post je testais sur une certaine adresse que mon debuggueur m'a indique mais celle-ci change tout le temps (oui je sais c'est normal...), le ne marche pas non plus.
    Je désespère...

    de m'aider

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par homer1983 Voir le message
    Merci pour ta réponse ram_0000.
    de m'aider
    Question à se poser entre amis: quelle est la valeur d'une variable non initialisée ?

    Réponse : ça dépends.

    Conclusion : il est inutile d'espérer obtenir une valeur particulière pour une variable non initialisée, puisque (par essence) si elle avait une valeur particulière connue, alors elle serait considérée comme étant initialisée. Un code comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (function == (LPWORD)(0xcccccccc)) ...
    N'a aucune chance de fonctionner.

    Quoi qu'il en soit, l'appelant de ta fonction hllapi doit te fournir l'ensemble des paramètres, et ceux ci doivent être valides. Qu'est-ce que ton debugger donne comme information pour les quatre valeurs ?
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Par défaut
    Eh bien finalement, ça y est j'ai trouve un moyen de faire fonctionner cela.
    Bon ça ne me dira toujours pas pourquoi lorsque je teste avec un simple IF l'affectation ne marche pas mais bon, la ça marche...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
            WORD mvalue;
            mvalue = 0;
            try 
    	{
    		fout << "Value: " << (int)(*value) << endl << endl;
    	}
    	catch ( ... ) 
    	{
    		fout << "Exception ........ Value" << endl << endl;
    		value = &mvalue ;
    	}
    Enfin merci a ceux qui ont participe..

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    En fait, je pense que tu n'as résolu qu'une partie de ton problème.

    Tu reçois un pointeur non initialisé (donc qui possède une valeur aléatoire) et tu attrapes l'exception "Violation d'accès lors de la lecture" ou équivalent.

    Imagine maintenant que tu recoives un pointeur non initialisé mais dont la valeur tombe par hasard dans ton espace mémoire (pointeur un peu fou mais pas trop quand même, j'aime bien ce nom). Tu n'auras pas d'exception levée mais tu auras quand même une valeur bidon.
    Sans compter que dans ce cas, si ta fonction appelée modifie la valeur pointée par le pointeur "un peu fou mais pas trop quand même", tu vas mettre le bazar chez l'appelant.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Servlet] Fichiers d'initialisation
    Par david71 dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 03/09/2003, 13h47
  2. Créer et initialiser un composant TStatusBar :help:
    Par James_ dans le forum C++Builder
    Réponses: 10
    Dernier message: 21/08/2003, 08h52
  3. [servlet] initialisation d'objets
    Par tiPouick dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 05/08/2003, 12h12
  4. Initialisation de XMLModule
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 10
    Dernier message: 01/04/2003, 10h08
  5. initialisation Directinput avec delphi
    Par Madmaxx dans le forum DirectX
    Réponses: 1
    Dernier message: 21/02/2003, 17h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo