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

Vue hybride

MogDeChNord [VStudio 6] pb avec fonctions... 07/01/2004, 11h56
farscape salut, ta dll ne tourne pas... 07/01/2004, 12h11
MogDeChNord Cela pourrait peut-être poser... 07/01/2004, 14h11
BertrandA Mouais, en gros tu prétends... 07/01/2004, 15h18
MogDeChNord Finalement t'avait raison ! ... 07/01/2004, 15h19
Pucpood N'y aurait-il pas un problème... 07/01/2004, 15h44
MogDeChNord Pas à ma connaissance 07/01/2004, 16h04
farscape salut ,ta pense à... 07/01/2004, 17h02
MogDeChNord En fait, le problème devait... 08/01/2004, 08h57
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 20
    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ù !) ?

  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
    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
    Membre averti
    Inscrit en
    Octobre 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 20
    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 !

  4. #4
    Membre expérimenté Avatar de BertrandA
    Inscrit en
    Août 2003
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 170
    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...

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

    Les autres problèmes venaient d'ailleurs !

  6. #6
    Membre du Club
    Inscrit en
    Mai 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 8
    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
    Membre averti
    Inscrit en
    Octobre 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 20
    Par défaut
    Pas à ma connaissance

  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
    Par défaut
    salut ,ta pense à l'alignement memoire ?

  9. #9
    Membre averti
    Inscrit en
    Octobre 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 20
    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.

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