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

Bibliothèques Discussion :

Problème complexe de dll utilisé avec Access


Sujet :

Bibliothèques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Sonic
    Inscrit en
    Mars 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 105
    Par défaut Problème complexe de dll utilisé avec Access
    Bonjour à tous
    J'ai une colle et je voudrais savoir si quelqu'un pourrait m'éclairer.
    Je suis en train de développer des dlls pour ne plus utiliser les modules sous Access. Jusque là tout va bien.
    J'ai un fichier .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    extern "C" export int __stdcall Addition(int, int ); 
    extern "C" export BSTR __stdcall TravailSurChaine(char* );
    et un fichier .cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    extern "C" int __stdcall Addition(int a, int b )
    {
        return a + b;
    }
     
    extern "C" BSTR  __stdcall TravailSurChaine(char* Nom)
    {
        return (SysAllocStringByteLen(strrev(Nom), strlen(Nom)));
    }
    Pour avoir deux exemples, un sur des chiffres et l'autre sur des chaines de caractères. J'ai bien lu les trucs sur BSTR et tout ca.
    Quand j'appelles ces fonctions dans le code pas de soucis tout fonctionne bien. Par contre un truc pratique c'est que les fonctions peuvent utiliser dans le requêtes.
    Ainsi si je fais dans une requete "SELECT Addition([Champ1],[Champ2]) FROM MaTable", ca marche aussi.
    Mais si je fais "SELECT TravailSurChaine([Champ1]) FROM MaTable", j'obtiens bien mon nombre d'enregistrement mais pour chaque enregistrement mon champ est vide ? Du coup je comprend pas dans le code ca marche, dans les requêtes pour les champs numériques ca marche mais avec des chaines de caractères ca retourne une valeur nulle. C'est peut-être un problème de perte d'adressage dû à SysAllocStringByteLen mais je vois pas.
    Si vous avez une idée merci beaucoup

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    La BSTR obtenue par SysAllocStringByteLen() n'est pas une BSTR "texte" valide, elle est considérée comme étant des données binaires.

    Pour que la BSTR soit une chaîne valide, tu dois utiliser une chaîne de wchar_t et non une chaîne de char.

    PS: À quoi sert strrev() ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éprouvé Avatar de Sonic
    Inscrit en
    Mars 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 105
    Par défaut
    Merci pour ta réponse
    J'ai lu partout que la correspondance String en Vb était BSTR en C++, c'est pour ca que j'ai utilisé ca.
    Je viens de modifier ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" wchar_t*  __stdcall TravailSurChaine(char* Nom)
    Mais le résultat est le même quand je fais un bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim Temp as String
    Temp = TravailSurChaine("Toto")
    MsgBox Temp
    Ca marche nickel il m'affiche "otot" mais quand je fais ca dans une requete il me retourne encore des champs vides ...

    PS : le strrev c'est juste histoire de faire qqc sur ma chaine (ca retourne la chaine inversée)

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    VB peut être plus tolérant que d'autres choses...
    Essaie en convertissant la chaîne en unicode avant de faire un SysAllocString() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    extern "C" BSTR  __stdcall TravailSurChaine(char* Nom)
    {
        strrev(Nom);
     
        std:wostringstream ossW;
        ossW << Nom;
        std::wstring NomW = ossW.str();
        return SysAllocString(NomW.c_str());
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu peux aussi essayer ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    extern "C" BSTR  __stdcall TravailSurChaine(char const * Nom)
    {
        std:wostringstream ossW;
        ossW << Nom;
        std::wstring NomW = ossW.str();
        BSTR bsNom = SysAllocString(NomW.c_str());
     
        wcsrev(bsNom);
        return bsNom;
    }
    Ce qui a l'avantage de ne pas modifier la chaîne passée en paramètre.
    Mais je ne garantis pas que ça marchera, je ne sais plus si SysAllocString() place ou non un caractère nul à la fin de la chaîne.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre éprouvé Avatar de Sonic
    Inscrit en
    Mars 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 105
    Par défaut
    Je suis désolé je suis pas encore très au point sous c++, j'ai ajouté ton code mais il ne compile pas il ne reconnait pas wostringstream. Je dois inclure quoi ? (Pour info je suis sous VS 6)
    Merci encore de ton aide

Discussions similaires

  1. Problème de requète INSERT INTO avec access
    Par Hipopo dans le forum VB.NET
    Réponses: 7
    Dernier message: 29/03/2010, 12h52
  2. Réponses: 1
    Dernier message: 06/05/2009, 10h33
  3. Réponses: 2
    Dernier message: 07/01/2009, 18h03
  4. Problème pour requête SQL LIKE avec ACCESS
    Par ar.aziz dans le forum VB.NET
    Réponses: 2
    Dernier message: 02/07/2008, 10h53
  5. Problème Syntaxe requête SQL LIKE avec ACCESS
    Par Arnofish dans le forum Accès aux données
    Réponses: 3
    Dernier message: 22/12/2007, 11h57

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