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 :

passage de paramètre dans l'appel d'une fonction venant d'une dll (C++ & Delphi)


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 74
    Par défaut passage de paramètre dans l'appel d'une fonction venant d'une dll (C++ & Delphi)
    Bonjour,

    Le code suivant (écrit en C++) charge une fonction d'une dll (dll écrite en delphi), et, est censé m'afficher du texte passé en paramètre.
    Celà ne fonctionne pas, le texte retourné semble toujours "null" ...
    (Le chargement de la dll etc est ok)

    Je ne comprend pas d'où vient l'erreur

    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
    	private: System::Void bt_sbHelloParam_Click(System::Object^  sender, System::EventArgs^  e) {
     
    				typedef  wchar_t* (*fct_sbHelloParam)(LPSTR txt);
    				fct_sbHelloParam fsbHelloParam;
     
    				fsbHelloParam = (fct_sbHelloParam)GetProcAddress(hInstLibrary, "_sbHelloParam");
    				if (fsbHelloParam){
    					LPSTR txt = "test";
    					std::wstring res = fsbHelloParam(txt);
    					MessageBox::Show(System::Convert::ToString(gcnew String(res.c_str())),"msg",MessageBoxButtons::OK,MessageBoxIcon::Question);
    				}else{
    					MessageBox::Show("GetProcAddress for _sbHelloParam failed !","msg",MessageBoxButtons::OK,MessageBoxIcon::Question);
    				}
     
    		 }

    fonction en elle même (écrite en delphi)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function _sbHelloParam(txt:PChar):Pchar; stdcall;
      var
        res : Pchar;
     begin
      StrPCopy(res,sbHelloParam(StrPas(txt))) ;
      Result := res;
     end ;

    PS: j'ai fais une fonction HelloWorld qui elle affiche un texte prédéfini dans la DLL delphi, et ça, ça marche.


    Mais mon HelloParam est censé afficher un texte passé en paramètre, et c'est là que se pose mon problème (le passage de valeur en paramètres)

  2. #2
    screetch
    Invité(e)
    Par défaut
    pchar n'est pas comme wchar_t *
    et StrPCopy m'a l'air suspect

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 74
    Par défaut
    Citation Envoyé par screetch Voir le message
    pchar n'est pas comme wchar_t *
    et StrPCopy m'a l'air suspect
    pourtant la même fonction mais sans passage de paramètre, marche sans probleme ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function _sbHelloWorld():Pchar; stdcall;
      var
        res : Pchar;
     begin
      StrPCopy(res,sbHelloworld()) ;
      Result := res;
     end ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	private: System::Void bt_sbHelloWorld_Click(System::Object^  sender, System::EventArgs^  e) {
     
    				typedef  wchar_t* (*fct_sbHelloWorld)();
    				fct_sbHelloWorld fsbHelloWorld;
     
    				fsbHelloWorld = (fct_sbHelloWorld)GetProcAddress(hInstLibrary, "_sbHelloWorld");
    				if (fsbHelloWorld){	
    					std::wstring res = fsbHelloWorld();
    					MessageBox::Show(System::Convert::ToString(gcnew String(res.c_str())),"msg",MessageBoxButtons::OK,MessageBoxIcon::Question);
    				}else{
    					MessageBox::Show("GetProcAddress for _sbHelloWorld failed !","msg",MessageBoxButtons::OK,MessageBoxIcon::Question);
    				}
    		 }
    je capte pas ... suis sur c une bétise, mais ????

  4. #4
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef  wchar_t* PASCAL (*fct_sbHelloParam)(LPSTR txt);
    ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 74
    Par défaut
    Citation Envoyé par screetch Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef  wchar_t* PASCAL (*fct_sbHelloParam)(LPSTR txt);
    ?
    L'ajout d'un PASCAL ou d'un _STDCALL provoque un plantage à l'exécution.


    je viens d'essayer ceci, qui me parait plus cohérent au niveau des déclaration de variable ... mais le résultat est le même mon msgbox est vide.

    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
    	private: System::Void bt_sbHelloParam_Click(System::Object^  sender, System::EventArgs^  e) {
     
    				typedef  wchar_t* (*fct_sbHelloParam)(std::wstring txt);
    				fct_sbHelloParam fsbHelloParam;
     
    				fsbHelloParam = (fct_sbHelloParam)GetProcAddress(hInstLibrary, "_sbHelloParam");
    				if (fsbHelloParam){
    					std::string txt = "test";
    					std::wstring wtxt = wtxt.assign(txt.begin(),txt.end());
    					std::wstring res = fsbHelloParam(wtxt);
    					MessageBox::Show(System::Convert::ToString(gcnew String(res.c_str())),"msg",MessageBoxButtons::OK,MessageBoxIcon::Question);
    				}else{
    					MessageBox::Show("GetProcAddress for _sbHelloParam failed !","msg",MessageBoxButtons::OK,MessageBoxIcon::Question);
    				}
     
    		 }
    si je fais un msgbox d'un texte fixe genre "zzz", il s'affiche bien, donc c'est le problème vient de quelque part au niveau de l'appel de ma fonction, ou du résultat qu'elle envoie.

  6. #6
    screetch
    Invité(e)
    Par défaut
    ah j'avais manque le stdcall sur ta fonction en pascal.

    je suis sur a 90% que la signature devrait etre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef  char* STDCALL (*fct_sbHelloParam)(char* txt);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function _sbHelloParam(txt:PChar):Pchar; stdcall;
      var
        res : Pchar;
     begin
      StrPCopy(res,sbHelloParam(StrPas(txt))) ;
      Result := res;
     end ;
    et si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    myString  := 'Hello World';
    Result := Addr(myString[1]);
    ca fait longtemps que j'ai pas fait de pascal, alors je suis pas sur que ca peut marcher...

    ou sinon est-ce que marche?

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par vin100H Voir le message
    si je fais un msgbox d'un texte fixe genre "zzz", il s'affiche bien, donc c'est le problème vient de quelque part au niveau de l'appel de ma fonction, ou du résultat qu'elle envoie.
    Ca me fait beaucoup penser à un problème de responsabilité mémoire.
    En gros la chaîne pascal que tu espères récupérer en C++ est supprimée en sortie de la fonction Pascal. Et n'arrive donc jamais dans le C++.
    Ne peux-tu pas améliorer la fonction pour prendre en paramètre out la chaîne à remplir ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. [JavaScript] [FAQ] Appeler dynamiquement une fonction et passer une fonction en argument
    Par SpaceFrog dans le forum Contribuez
    Réponses: 0
    Dernier message: 28/05/2008, 14h48
  2. Réponses: 2
    Dernier message: 26/04/2008, 17h31
  3. Réponses: 4
    Dernier message: 30/11/2007, 14h46
  4. Appel d'une fonction A depuis une fonction B.
    Par LeFlou dans le forum C++
    Réponses: 9
    Dernier message: 22/05/2007, 17h36
  5. Passer une fonction comme argument à une fonction
    Par Cocotier974 dans le forum Général Python
    Réponses: 4
    Dernier message: 29/06/2004, 13h41

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