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

  • Auteur de la discussion sarl_adc
  • Date de début

sarl_adc

Nouveau membre
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:
[g]char* __stdcall RecupNomTable(int CodeOp)
{
char* StrTmp;
switch (CodeOp)
{
case 1:
StrTmp = "Cisaillage"; break;
}
return StrTmp;
}[/g]

Voilà ma déclaration et mon appel en VB :
[g]Private Declare Function RecupNomTable Lib "testdll7.dll" Alias "_RecupNomTable@4" (ByVal CodeOP As Integer) As String[/g]
et
[g]MsgBox RecupNomTable(1)[/g]
 

jdangu

Nouveau membre
Les string VB sont en unicode. Donc passe ta dll en unicode aussi !
 

sarl_adc

Nouveau membre
C'est une modif à faire dans les propriétés du projet ou dans le code ?

J'utilise lcc-win32 pour compiler, où dois-je faire la modif ? ;)
 

jdangu

Nouveau membre
il y a un #define à faire a cote de tes includes.
genre "#define UNICODE" ou un truc du genre.
Puis chaque string doit etre au format L"", par exemple L"Cisaillage"
Bon courage.
 

sarl_adc

Nouveau membre
J'ai trouvé un autre moyen, c'est d'utiliser le type BSTR à la place de mes LPSTR (ou Char*).

Lorsque je déclare ma fonction ainsi :
BSTR __stdcall RecupNomTable(int CodeOp)

Il faut juste convertir les chaines de caractères que j'utilise dans ma fonction avant de les renvoyer et ça fonctionne !

Je testerais tout de même ton idée :)

Meric !!
 

sarl_adc

Nouveau membre
A vrai dire ça ne fonctionne toujours pas, quoi que je fasse...

En fait ma fonction fonctionne mais me retourne une chaine bizarre avec des caractères qui ne s'affichent pas à la fin...

Personne a déjà fait une fonction en C qui renvoie une chaine de caractères pour du VB ???
:??: :??: :??:
 

fmo

Nouveau membre
J'ai jamais fait ce que tu demandes, mais il y a quelque chose qui me chagrine.
Ta fonction retourne un pointeur qui est une variable locale de ta DLL.

pour ma part je verais plus un retour dans une variable du basic dimensionnee pour recevoir la reponse.
Un truc du style

char* __stdcall RecupNomTable(int CodeOp,char *Reponse)
{
switch (CodeOp)
{
case 1:
strcpy(Reponse,"Cisaillage");
}
return Reponse;
}

avec un appel depuis le basic du style

dim nom as string 50

RecupNomTable(1,nom)

 

sarl_adc

Nouveau membre
FMo : En fait ce que je voudrais faire c'est pouvoir appeler ma fonction de cette manière sous VB (C'est un exemple) :
[g]Msgbox "Erreur dans la table " & RecupNomTable(1) & ", veuillez lancer une réparation."[/g]

C'est pour cela que je veux renvoyer une chaine de caractères.
De plus, je trouve que ça fait trop de gérer la limite du nombre de caractères (peut-être parce que je suis habitué au VB aussi).

Et ce qui me chagrine aussi c'est de devoir passer un paramètre en référence alors que je peux le renvoyer et l'utiliser sans avoir à déclarer de variable en VB.

Mais après tout ce que j'ai vu j'ai trouvé une solution avec ce type de retour :

[g]return SysAllocString(OLESTR(maChaine));[/g]
en déclarant maChaine de type [g]LPSTR[/g].

Ca m'oblige à déclarer une chaine de longueur fixe sous VB et de remplacer ensuite les caractères Vides (vbNullChar) par des valeurs nulles (VbnullString).

Et sinon pour ton site jdangu, je l'avais déjà et même avec ses exemples je n'étais pas arrivé à faire ce que je voulais :)

Merci pour toutes vos réponses,
quand ça marchera je posterais les différentes solutions que j'aurais trouvé.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 064
Membres
1 586 286
Dernier membre
petitangebleu1977
Partager cette page
Haut