[C] Accéder via VB à une fonction en C retournant une chaine de caracs

Accéder via VB à une fonction en C retournant une chaine de caracs [C] - C - Programmation

Marsh Posté le 18-06-2004 à 11:16:07    

Hello,
 
J'ai commencé à développer une DLL en C pour ensuite appeler les fonctions via VB.
 
Le problème est que lorsque je tente de retourner une chaine de caractères de ma fonction en C dans VB, ça me plante mon appli VB... :-/
 
Voilà ma fonction en C:
char* __stdcall RecupNomTable(int CodeOp)
{
 char* StrTmp;
 switch (CodeOp)
 {
  case 1:
   StrTmp = "Cisaillage"; break;
 }
 return StrTmp;
}

 
Voilà ma déclaration et mon appel en VB :
Private Declare Function RecupNomTable Lib "testdll7.dll" Alias "_RecupNomTable@4" (ByVal CodeOP As Integer) As String
et  
MsgBox RecupNomTable(1)
 
Merci pour vos réponses,


Message édité par guillot le 18-06-2004 à 11:17:59
Reply

Marsh Posté le 18-06-2004 à 11:16:07   

Reply

Marsh Posté le 18-06-2004 à 11:34:38    

vi, mais ta variable StrTmp est détruite au return là ...
Déclare là statique peut-être.

Reply

Marsh Posté le 18-06-2004 à 11:55:37    

Ca ne change rien.
De toute façon ça me renvoie la valeur de la variable et non la variable, et même si je met return "test";, ça me plante :
- Espace de pile insuffisant
- Mémoire insuffisante
- Ou plantage sévère qui quitte VB...

Reply

Marsh Posté le 18-06-2004 à 12:10:51    


tu déclares comment ta chaine dans VB ? enfin au niveau proto ?
Il faut la déclarer : by Val pour en faire un pointeur sur une chaine

Reply

Marsh Posté le 18-06-2004 à 13:00:27    

Ben ma chaine je la déclare pas si j'utilise MsgBox
 
Ma déclaration de fonction me renvoie un "String" et moi je l'affecte à un String, le ByVal me sert seulement pour mon "Integer" que j'envoie (Je n'envoie pas de chaine en VB, seulement en C).

Reply

Marsh Posté le 18-06-2004 à 13:45:31    

... Je viens de lire que ce n'est pas possible dans la doc de VB, sauf si la Dll a spécialement été écrite pour ^tre utilsée avec VB, mais là j'avoue ne pas savoir ce que cela veut dire ...

Reply

Marsh Posté le 18-06-2004 à 14:00:39    

Normalement c'est possible de renvoyer une chaine de caractères. Pas mal de monde a pu créer des DLL en C avec passages/renvois de chaines de caractères vers du VB.
 
On m'a parlé d'en-têtes unicodes ou ANSI à modifier dans mes sources en C. L'ennui c'est que je ne sais pas où ni comment faire ça  :??:

Reply

Marsh Posté le 18-06-2004 à 14:13:12    

Ce n'est pas ce que dit la doc de VB ...
Sinon tu peux aussi la passer en argument à ta fonction, en la prototypant byVal, et là tu peux la modifier dans ta dll, ça devrait être modifié en VB aussi.

Reply

Marsh Posté le 18-06-2004 à 14:19:47    

Oui c'est vrai, mais l'ennui c'est que ça m'oblige à déclarer une variable en VB pour stocker la valeur de la chaine.
 
Mais je crois que je vais faire ainsi.
 
Merci pour tes réponses :)

Reply

Marsh Posté le 18-06-2004 à 14:40:09    

Même problème en passant ma chaine en paramètre...
 
Avec les nombres je peux faire ce sur je veux mais dès que je touche à une chaine de caractères ça déconne...  :(

Reply

Marsh Posté le 18-06-2004 à 14:40:09   

Reply

Marsh Posté le 18-06-2004 à 15:35:41    

Zarbi ça ... as-tu initialisé la chaine que tu passes en paramètre ?

Reply

Marsh Posté le 18-06-2004 à 16:09:34    

j'ai trouvé ça si ça peut t'aider, pas regardé ...
http://sandsprite.com/CodeStuff/
Writing_A_C_Dll_for_VB.html

Reply

Marsh Posté le 19-06-2004 à 12:36:53    

J'ai regardé et apparemment il parle bien de types BSTR pourles chaines de caractères à la place des PTSTR (ou char*). Je testerais Lundi.
 
Merci :)

Reply

Marsh Posté le 22-06-2004 à 11:18:02    

Apparemment ça pose pas mal de pbs les passages de chains de caractères de C vers VB.
J'ai trouvé des solutions approximatives, mais qui fonctionnent pratiquement à 100%.
 
Je reviendrais faire un topo de ce que j'ai trouvé quand ça marchera.

Reply

Marsh Posté le 22-06-2004 à 14:05:29    

Un lien qui me semble pas mal du tout :
http://rp.developpez.com/vb/tutoriels/dll/
J'ai testé, ça marche bien :)

Reply

Marsh Posté le 22-06-2004 à 15:52:57    

maetun : j'avais déjà vu ce lien et c'est vrai que c'est bien expliqué.
 
Mais malheureusement y'a pas possibilité de renvoyer une chaine de caractères avec ses exemples...
 
Alors j'ai pu voir que je pouvais renvoyer une chaine de caractères, mais lorsque je la récupère dans VB, soit je récupère des caractères incorrects à la fin de ma chaine (meme si je l'initialise)soit j'utilise malloc et là ca pose un autre probleme c'est que je ne peux pas exécuter le free(maChaine) vu que ma dernière instruction est un "return maChaine"...
 
 
arg ! A mon avis y'a pas moyen.. Faut passer par référence pour que ça tourne !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed