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

MFC Discussion :

[VStudio 6] pb avec fonctions dans une DLL


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 20
    Points : 7
    Points
    7
    Par défaut [VStudio 6] pb avec fonctions dans une DLL
    J'ai créé une API dans une DLL (at_xpedite.dll) et les fonctions ne fonctionnent pas correctement lorsqu'elles sont appellées depuis mon programme de test alors qu'elles fonctionnent très bien si je les copie dans le code de mon prog de test.

    --Code DLL--

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    [xip_fax.h]
    [...]
    #ifdef __cplusplus
      extern "C" {
    #endif
    AT_XPEDITE_API int XIP_FAX_WriteOutputMode(FILE* dest, char* mode);
    #ifdef __cplusplus
      };
    #endif
    [...]
     
    [xip_fax.c]
    [...]
    int XIP_FAX_WriteOutputMode(FILE* dest, char* mode) {
      char toWrite[XIP_LINE_SIZE+1] = "";
      unsigned int size = 0;
      size = sprintf(toWrite, "OUTPUTMODE %s", mode);	
      if(fwrite(toWrite, 1, size, dest) != size) return XIP_ERROR;
      return XIP_SUCCESS;
    }
    [...]
    -- Code Test --

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main(int argc, char* argv[]) {
      int ret = 0;
      FILE* xipFile ;
     
      if((xipFile = fopen("c:\\_temp_\\file.xip.txt", "wt")) == NULL) {
        return FAX_XPD_ERROR;
      }
     
      ret = XIP_FAX_WriteOutputMode(xipFile, "standard");
      fclose(xipFile);
    }
    J'ai droit à un beau "Unhandled exception in test.exe (NTDLL.DLL): xxx Access violation"

    En mode débug j'ai remarqué que les fonction de base ne fonctionnait même pas:
    "unsigned int size = 0" ne m'initialize par la variable (en tout cas pas à 0)
    "sprintf()" ne copie pas toujours la chaine demandé (toujours la même)
    "strlen()" retourne des noombre abérrant (19 normalement)

    D'où cela peut-il venir (je viens de rebooter au cas où !) ?
    kupo !

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    ta dll ne tourne pas dans le meme thread que le prog principal ,donc ton handle de fichier d'apres moi n'est pas valide dans la dll.
    si tu fais un dll avec des fonctions d'écriture sur flux etc ... fait une fonction d'ouverture/création du flux dans la dll ou le handle du flux est local à la dll.
    Comme ça ta dll est vraiment indépendante.


  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    Cela pourrait peut-être poser problème mais il y a déjà des chose bizarre avant même de faire le fwrite:

    L'affectation de "size" ne fonctionne même pas !
    kupo !

  4. #4
    Membre habitué Avatar de BertrandA
    Inscrit en
    Août 2003
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 170
    Points : 197
    Points
    197
    Par défaut
    ta dll ne tourne pas dans le meme thread que le prog principal donc ton handle de fichier d'apres moi n'est pas valide dans la dll.
    Mouais, en gros tu prétends que les données d'un thread ne sont pas accessibles à un autre thread dans le même processus ?
    Alors les critical sections ne servent à rien !
    Sauf erreur, une DLL se trouve dans un module distinct, mais ce module est mappé dans l'espace adressable du processus père.
    Je pense que cela devrait fonctionner tel quel... sauf si les modules utilisent 2 versions différentes de la librairie standard du C !
    VC++ propose différentes DLL pour la librairie standard du C : single threaded / multithread avec ou sans les symboles de debug.
    Si l'application utilise une version single threaded et la DLL une version multithread : badaboum.
    On se retrouve en effet avec 2 modules qui manipulent chacun un descripteur de fichier différent.

    Et bien évidemment en mode debug, utiliser la DLL compilée en version debug...
    Les orteils servent à trouver les pieds de chaise et les montants de porte quand il fait noir.

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    Finalement t'avait raison !

    Les autres problèmes venaient d'ailleurs !
    kupo !

  6. #6
    Futur Membre du Club
    Inscrit en
    Mai 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    N'y aurait-il pas un problème de convention d'appel (manière dont les paramètres sont passés à la fonction de la DLL) ?

  7. #7
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    Pas à ma connaissance
    kupo !

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut ,ta pense à l'alignement memoire ?

  9. #9
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    En fait, le problème devait venir d'une histoire de contexte différents (je ne connais pas bien la config VS6) entre le prog de test et la DLL. Ainsi, comme le disait farscape, faire les opération d'ouverture/fermeture dans la DLL résolvait mon pb.

    Cependant, pour d'autres raisons, les prototypes des fonctions de mon API ont changé afin d'être plus générique. Je n'aurais donc plus de manipulation de descripteur de fichier à manipuler et donc plus ce genre de soucis:

    char* XIP_FAX_WriteOutputMode(char* dest, char* mode);

    Maintenant c'est une API se charge uniquement de "traduire" la chaine de caractère. L'écriture du fichier se fera lors d'une seconde étape. On se réserve ainsi la possiblité d'utiliser ces chaines manipulées dans un buffer/sortie standart/fichier en fonction des projets.

    Merci du coup de main.
    kupo !

Discussions similaires

  1. recuperer une fonction avec arguments dans une dll
    Par freuh94 dans le forum Windows
    Réponses: 3
    Dernier message: 03/10/2009, 11h45
  2. Réponses: 3
    Dernier message: 01/05/2007, 16h07
  3. Point d'entrée d'une fonction dans une DLL
    Par Muetdhiver dans le forum MFC
    Réponses: 5
    Dernier message: 15/02/2006, 23h49
  4. [MFC][DLL]Dialog Avec ActiveX dans une DLL ?
    Par matazz dans le forum MFC
    Réponses: 1
    Dernier message: 16/05/2005, 16h36
  5. PB avec "self" dans une dll
    Par DiJiRiDouS dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2003, 09h32

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