Load DLL C++ From PureBasic

Programmation d'applications complexes
john007
Messages : 6
Inscription : mar. 09/déc./2008 0:34

Load DLL C++ From PureBasic

Message par john007 »

Bonjour
quelqu'un parmi vous a déja eu le probleme suivant ??
en fait j'ai crée un DLL en PureBasic et je veux le charger depuis une petite application C++ un projet de test avant de travailler sur le vrai projet
bon le chargement du DLL marche très bien et tout marche nikel à part que il y'a une fonction dans le DLL que j'ai crée en PureBasic qui prend en argument un string "msg.s" aprés j'affiche le string pour tester mais ça marche pas il y'a un probleme dans le string.alors je me suis dit qu'il y'a un probleme de type de string entre le C++ et le pure basic

voila le code source du DLL:>
----------------------------------

Code : Tout sélectionner

#TESTDLL = 0
CompilerIf #TESTDLL = 0






;-----------------------------------------------------------------------------------------------------------
  ;Constructeur si il a été charger Dans le Process Distant
  ProcedureDLL AttachProcess(Instance)
  ;MessageRequester("Reponse PB", Message$, #MB_ICONINFORMATION)
  EndProcedure

  
  ProcedureDLL DetachProcess(Instance)
  ;MessageRequester("Reponse PB", Message$, #MB_ICONINFORMATION)
  EndProcedure
                      
                       ;----------------------------------------------------------------
      
  ;Constructeur si il a été charger  Dans le thread du process Distant
  ProcedureDLL AttachThread(Instance)
  ;MessageRequester("Reponse PB", Message$, #MB_ICONINFORMATION)
  EndProcedure

  ProcedureDLL DetachThread(Instance)
  ;MessageRequester("Reponse PB", Message$, #MB_ICONINFORMATION)
  EndProcedure
;--------------------------------------------------------------------------------------------------------

  ProcedureDLL display_string(msg.s)
    MessageRequester("DLL de Test !",msg, #MB_ICONINFORMATION)
  EndProcedure
 
 
 ProcedureDLL msgbox_pb()
    MessageRequester("Fonction Pure Basic !", "Fonction De Test Faite En PureBasic", #MB_ICONINFORMATION)
  EndProcedure
  
  
  










CompilerElse    
CompilerEndIf






et voila le code Visual C++ qui charge le DLL
-------------------------------------------

#pragma comment(lib, "c:\\Test_PB.lib") 
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;
 
typedef int (*f1)();
typedef char* (*f2)(string); 

HINSTANCE hh;
 
void main(){
  f1 msbox;
  f2 show;
  hh = LoadLibrary("c:\\Test_PB.dll");
  //hinstDLL = LoadLibrary("C:\\Program Files\\Microsoft Visual Studio\\MyProjects\\mmm\\Debug\\mmm.dll");
  if(hh != 0){
      msbox = (f1) GetProcAddress(hh, "msgbox_pb");
	  show = (f2)  GetProcAddress(hh, "display_string");
  }
  int x = msbox();
  string rep("Chaine de Teste");
  //strcpy(rep,show("Chaine En Parametre Pour Le DLL PureBasic"));
  cout<<show(rep);

  FreeLibrary(hh);
  getch();
}
merci encore
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Code : Tout sélectionner

#pragma comment(lib, "E:\\Programmation\\PureBasic\\Projets\\TEST_DLL.lib")
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;

typedef int (*f1)();
typedef char* (*f2)(const char *);

HINSTANCE hh;

int main(){
  f1 msbox;
  f2 show;
  hh = LoadLibrary("E:\\Programmation\\PureBasic\\Projets\\TEST_DLL.dll");
  if(hh != 0){
      msbox = (f1) GetProcAddress(hh, "msgbox_pb");
     show = (f2)  GetProcAddress(hh, "display_string");
  }
  int x = msbox();
  string rep("Chaine de Teste");
  cout << show(rep.c_str());

  FreeLibrary(hh);
  getch();

  return 0;
}
"Qui baise trop bouffe un poil." P. Desproges
john007
Messages : 6
Inscription : mar. 09/déc./2008 0:34

Message par john007 »

salut "KarLKoX" tu n'as absolument rien fait tu as posté mon code
est ce que tu croix que le probleme viens du parametre à passé dans la fonction "display_string" tu as utilisé avec typedef char* (*f2)(const char *);
j'ai déja éssayé ça et j'ai aussi pensé à const pour qu'elle ne soit pas modifié ... mais ça ne marche toujours pas le chargement marche et j'ai access à toutes les fonction qui existe dans la DLL mais le probleme c'est dans le passage de parametre à la fonction "display_string" qui doit recevoir une String.mais quand je passe une char* ou const char* ou même string la DLL affiche des caractéres spéciaux n'importe quoi
si vous avez une idée
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

john007 a écrit :salut "KarLKoX" tu n'as absolument rien fait tu as posté mon code
est ce que tu croix que le probleme viens du parametre à passé dans la fonction "display_string" tu as utilisé avec typedef char* (*f2)(const char *);
j'ai déja éssayé ça et j'ai aussi pensé à const pour qu'elle ne soit pas modifié ... mais ça ne marche toujours pas le chargement marche et j'ai access à toutes les fonction qui existe dans la DLL mais le probleme c'est dans le passage de parametre à la fonction "display_string" qui doit recevoir une String.mais quand je passe une char* ou const char* ou même string la DLL affiche des caractéres spéciaux n'importe quoi
si vous avez une idée

Code : Tout sélectionner

cout << show(rep.c_str()); 
Ca marche (testé via gcc+vstudio), sinon, je n'aurais pas posté.
Un string est un objet et il n'y a pas de conversion implicite sauf en faisant un template ou en surchargeant l'opérateur '='.
"Qui baise trop bouffe un poil." P. Desproges
john007
Messages : 6
Inscription : mar. 09/déc./2008 0:34

Message par john007 »

excuser moi mais même avec cette converssion et même si on passe en paramétre "chaine" ou bien une variable de type char* aprés l'avoir remplit avec strcpy ça ne marche toujours pas j'ai testé tout ce qui est possible.même avec ton code ça ne marche pas la MessageRequester du DLL purebasic m'affiche n'importe quoi des caractére spécieux de type code assci 14 ou 15 ou 16 ....

et ça marche pour les int float double mais les chaines ça marche pas voila la fonction qui est supposé m'afficher la string

ProcedureDLL display_string(m1$)
MessageRequester("Int test DLL PureBasic!",m1$, #MB_ICONINFORMATION)
EndProcedure

j'utilise VS6 pour tester

merci encore
Anonyme

Message par Anonyme »

c_str() de donne la référence en mémoire.

essaye donc ceci :

Code : Tout sélectionner

ProcedureDLL display_string(*String)
MessageRequester("Int test DLL PureBasic!",Peeks(*String),#MB_ICONINFORMATION)
EndProcedure 
N'oublie pas que un string est un objet , et pas une variable $ en pb.
john007
Messages : 6
Inscription : mar. 09/déc./2008 0:34

Message par john007 »

ProcedureDLL display_string(*String)
MessageRequester("Int test DLL PureBasic!",Peeks(*String),#MB_ICONINFORMATION)
EndProcedure

wé je sais que c'est un objet j'avais tout éssayé même en passant juste une chaine en argument ça ne marche pas j'ai essayé pointeur qui théoriquement dois marcher coté C++ "char*" et coté Purebasic "msg$" aprés j'ai essayé les string et j'avais essayé de caster l'objet string en chaine comme t'as dit mais toujours ça ne marche pas.c'est la premiere fois que je reste coincé sur un truc comme ça.d'habitude je travaille bcp avec la technologie ATL j'ai ma propres bibliotheque de DLL ou j'ai mit des classes en C++ et d'autres languages et je fais appelles à ces classes Via la couche ATL depuis .NET ou java ou n'importe quel autre language ça permet d'utiliser la force de tout les language qui existent pour realisé mes projets.

pour moi mon language de base c'est C++ et un ami m'a parlé dernierement de purebasic je me suis interessé j'ai pas lû les cours j'ai vu quelque source mais je trouve qu'il est très très simple et surtout puissant.puisque je travaille bcp system.

mais je me suis bloquer ici mais encore une fois merci Cpl.Bator et merci KarLKoX de votre aide.
Anonyme

Message par Anonyme »

Pourtant , chez moi sa marche , le code de Karlkox fonctionne.
C'est bizarre , je compile avec codeblocks sous windows sans soucis.

Essaye avec procedureCDLL ?
john007
Messages : 6
Inscription : mar. 09/déc./2008 0:34

Message par john007 »

merci mais ça marche pas toujours je vais laisser tomber les DLL en Purebasic et travailler avec des DLL en C++
Dernière modification par john007 le mer. 10/déc./2008 21:02, modifié 1 fois.
john007
Messages : 6
Inscription : mar. 09/déc./2008 0:34

Message par john007 »

merci encore mon frére
Répondre