begin process at 2012 05 29 18:50:46
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

Pb de retour d'une chaine de carac. à partir d'une dll C++ sous Windows Seven 64bits


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Pb de retour d'une chaine de carac. à partir d'une dll C++ sous Windows Seven 64bits

dimanche 28 février 2010 à 11:25:47 | Pb de retour d'une chaine de carac. à partir d'une dll C++ sous Windows Seven 64bits

sherault

Bonjour,

Voici un point de blocage sur lequel je bute depuis pas mal de temps. Merci à ceux qui pourront m'aider.

J'ai développé un soft qui fonctionne sur Excel (VBA) et qui fait appel à des dll (codées en Visual C++ 6.0) pour effectuer des calculs. Tout fonctionne sans pb avec une plate forme 32 bits.

Sous Win Seven 64 bits, rien ne fonctionne en l'état, j'ai supposé une incompatibilité dans le codage des variables utilisées. J'ai recréé mes dll en utilisant Visual C++ Express 2008 (qui au passage ne me permet pas de compiler en natif pour les plate-formes 64 bits, mais peu importe).

Au final, les fonctions de mes dll qui retournent des valeurs numériques à mon code VBA fonctionnent sans pb.

Ca se complique avec les fonctions qui retournent des chaînes de caractères. A chaque retour d'une de ces fonctions, j'obtiens un plantage d'Excel qui se ferme de façon intempestive.

Initialement j'utilisais le code suivant :

Dans la DLL:

- Fichier d'entête:
#ifdef MADLL_EXPORTS
#define MADLL_API __declspec(dllexport)
#else
#define MADLL_API __declspec(dllimport)
#endif

- Fichier code:
LPSTR __stdcall RetourChaineParFonction(){
LPSTR* t = new LPSTR[5];
t[0] = "Texte par fonction";
return t[0];
}
void __stdcall RetourChaineParReference(char* ts){
strcpy(ts, "Texte par référence");
}

Dans la macro VBA:
Declare Function RetourChaineParFonction Lib "C:\Chemin\MaDll" () As String
Declare Sub RetourChaineParReference Lib "C:\Chemin\MaDll" (ByRef t As String, ByVal i As Long)

Public Sub RetourTexte()
Dim str() As String, i As Long, NbTxt As Long

str(1) = String(255, vbNullChar) 'allocation d'espace mémoire
str(1) = RetourChaineParFonction 'Provoque un plantage d'Excel
RetourChaineParReference str(1), 0 'Provoque un plantage d'Excel
End Sub


Bref, Excel plante à chaque tentative de récupération de ma chaine.
J'ajoute que j'ai également essayé d'utiliser le format LPCSTR, BSTR, sans plus de succès (le format LPTSTR bloque même à la compilation).

Enfin, je précise que ça marche sans pb sur une plate forme 32 bits.

Merci d'avance à tous ceux qui peuvent m'apporter leur aide.
dimanche 28 février 2010 à 13:26:25 | Re : Pb de retour d'une chaine de carac. à partir d'une dll C++ sous Windows Seven 64bits

BruNews

Administrateur CodeS-SourceS
Tu effaces tout cela, il n'y a strictement rien à conserver.

Pas de 'new' ou autres biniouteries du C++ (imagine la tronche de VBA au moment de désallouer...), la DLL doit etre codée et compilée en mode C et n'utiliser exclusivement que l'API pour les alllocs (SysAllocSring[xxx] pour les string VB).

Reporte toi aux nombreux exemples que j'ai fait de DLLs pour VB/VBA, sur cppfrance comme sur vbfrance.

ciao...
BruNews, MVP VC++
lundi 1 mars 2010 à 13:50:23 | Re : Pb de retour d'une chaine de carac. à partir d'une dll C++ sous Windows Seven 64bits

buno

Administrateur CodeS-SourceS
Hello,

LPSTR* t = new LPSTR[5];
t[0] = "Texte par fonction";


A mon avis, il y a plus que 5 caractères...

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
lundi 1 mars 2010 à 14:14:23 | Re : Pb de retour d'une chaine de carac. à partir d'une dll C++ sous Windows Seven 64bits

sherault

Pardon, il s'agit d'une faute de frappe.
J'avais bien mis :
LPSTR* t = new LPSTR[50];

mais ça ne fonctonne pas mieux.

Merci de ton aide
lundi 1 mars 2010 à 17:22:36 | Re : Pb de retour d'une chaine de carac. à partir d'une dll C++ sous Windows Seven 64bits

ed73

Bonjour,

LPSTR* t = new LPSTR[50]; alloue 50 LPSTR donc 50 char * et pas 50 char comme tu as l'air de le penser (t est un char**). Donc en faisant t[0] = "Texte par fonction"; t[0] contient l'addresse de "Texte par fonction" dans ta dll, il n'est donc pas très étonnant que tu ne récupères pas ce que tu veux dans ton code VBA.

Peut-être pourrais-tu essayer :

LPSTR* t = new LPSTR[50];
t[0] = new char[50];
strcpy( t[0], "Texte par fonction" );

ou bien si tu n'as besoin que d'une chaîne :

LPSTR t = new char[50];
strcpy( t, "Texte par fonction" );


lundi 1 mars 2010 à 18:06:05 | Re : Pb de retour d'une chaine de carac. à partir d'une dll C++ sous Windows Seven 64bits

BruNews

Administrateur CodeS-SourceS
Pourquoi cette insistance sur 'new' ???

ciao...
BruNews, MVP VC++
lundi 1 mars 2010 à 23:35:24 | Re : Pb de retour d'une chaine de carac. à partir d'une dll C++ sous Windows Seven 64bits

sherault

Bonjour ed73 et merci de ton aide

J'ai modifié mon code suivant tes conseils, mais j'obtiens toujours un plantage d'Excel dès que la fonction de ma dll retourne la chaine.
Je précise que la chaine de caractère est correctement écrite dans le tableau, je la visualise sans pb en mode debug. C'est après le "return" que ça plante.

Une autre idée ?
lundi 1 mars 2010 à 23:54:26 | Re : Pb de retour d'une chaine de carac. à partir d'une dll C++ sous Windows Seven 64bits

ed73

Désolé que ça ne fonctionne pas. Une autre idée serait d'allouer ta chaîne de caractères dans VB et de la passer à ta dll en paramètre, la fonction se chargeant de lui affecter les données.



Cette discussion est classée dans : pb, excel, dll, bits, madll


Répondre à ce message

Sujets en rapport avec ce message

Utilisation de DLL pour app 16 bits [ par 600 ] Salut, j'ai besoin d'utiliser des dlls dans la création d'une application 16bits sous DOS/Win16. le seul compilateur C que j'ai trouvé est Turbo C++ V Utilisation de DLL pour app 16 bits [ par 600 ] Salut, j'ai besoin d'utiliser des dlls dans la création d'une application 16bits sous DOS/Win16. le seul compilateur C que j'ai trouvé est Turbo C++ V DLL en C++, svp :( [ par NitRic ] Ca fait 4 jours que j'essaie de créée une simple DLL qui ne fait afficher qu'un simple MessageBox et ca ne fonctionne pas... :\Voici mon code au compl pb de lecture ecriture d'un fichier excel [ par margotfleur ] MargotFleur Bonjour à tous !Après avoir lu tout ce qu'il y a sur ce forum concernant l'accès à un fichier excel, (je suis débutante en VC++), je n'arr Utilisation de DLL dans un système 16 Bits DOS 6.22 [ par yass007 ] Voila,je voudrai savoir tt dabord sil ya des tutoriaux sur comment creer des Dlls sous Turbo C++ 3.0 et compatibles avec un système 16 Bits , en l'occ pb avec les dll !!! [ par ToasTy62 ] bon g une kestion a poser ki me tracasse... arghqd on fé une dll, on pt y mettre des variables globales, ok.ms est-ce ces variables globales sont tjrs PB d'E/S fichier avec une DLL [ par huberdine ] Je cherche a faire une DLL en C, dans la quelle je puisse faire des E/S fichier.Mon probleme est le suivant : la fonction fopen refuse de fonctionner importer une classe dans une dll [ par ilimo ] bonjour : j'ai deux programmes : Pa Pb Pa contient la classe Ca Pb contient la classe Cb Pb est une dll pour Pa comment importer la classe Cb dans la pb de linkage pendant la compilation sous VC.NET2003 [ par xjacques ] voila le pb que j ai a la compilation:nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in play.objC est lorsque j essaie de defi pb de lecture de fichier avec une DLL [ par loic81 ] J'ai fait un programme en C sous vc++6 qui lit un dans un fichier (en trottre) en utilsant la méthode des streams (fonction fread...).Lorsque je le c


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,671 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales