BSTR To char*

[Résolu]
Signaler
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
-
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
-
Bonjour,
Je cherche une fonction qui convertis un BSTR recu d'un prog VB en char*
J'ai essayer "VarI1FromStr" mais j'ai une erreur au linkage

Neo_Fr

12 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
TRAITER STRING VB PAR DLL C/C++ (WIN32)
http://www.cppfrance.com/code.aspx?ID=30115

ciao...
BruNews, MVP VC++
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
ok ca marche avec ca:
EXPORT BSTR




__stdcall
EncryptCesar

(
BSTR

*
Texte

,



long
Key

)
{

char*
Text

=



(char*)
HeapAlloc

(
GetProcessHeap

(),



0
,
strlen

((char*)
Texte

)



+
1
);

char*
Buff

;

char*
pText

;

pText

=
Text

;

Buff

=



(char*)



*
Texte

;

while(*
pText

=



*
Buff

){
pText

++;
Buff

++;}

pText

=
Cesar

(
Text

,
Key

);

BSTR Ret

=
SysAllocStringByteLen

(
Text

,
strlen

(
Text

));

HeapFree

(
GetProcessHeap

(),



0
,
Text

);

return
Ret

;
}


Merci a brunews et au autre.

Neo_Fr
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
J'ai essayer ce code mais il ne marche pas (ou je ne sais pas le faire marcher) http://www.cppfrance.com/code.aspx?ID=18655

Neo_Fr
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Ceci fonctionne sans problème pour moi:

BSTR wbuf = L"Bonjour les amis";
char abuf[256];

WideCharToMultiByte(CP_ACP, 0, wbuf, -1, abuf, sizeof(abuf), 0, 0);

C++ (@++)<!--
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
J'utilise cette fonction et la msgbox est vide :-(
EXPORT BSTR __stdcall EncryptCesar(BSTR Text, long Key)
{
    char* Buff = (char*) malloc( 1024 );
    char* Buff2 = (char*) malloc( 1024 );
    WideCharToMultiByte(CP_ACP, 0, Text, -1, Buff, sizeof(Buff), 0, 0);
    MessageBox(0, Buff, "Buff: ", 0);
    Buff2 = Cesar(Buff, Key);
    BSTR Ret = SysAllocStringByteLen(Buff2, strlen(Buff2));
    free(Buff);
    free(Buff2);
    return Ret;
}

Neo_Fr
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
WideCharToMultiByte(CP_ACP, 0, Text, -1, Buff, sizeof(Buff), 0, 0);

Buff est un pointeur et non un tableau, ce sizeof retournera toujours 4. Fait:

WideCharToMultiByte(CP_ACP, 0, Text, -1, Buff, 1024, 0, 0);

C++ (@++)<!--
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Je crois que finalement le probleme vient du prog vb, je recois rien du tt:

EXPORT BSTR

__stdcall EncryptCesar
(BSTR Text
,
long Key
)
{
MessageBox
(0,
(char*)Text
,
"Text: ",
0);
char* Buff
=
(char*) malloc
(
1024
);
char* Buff2 =(char*) malloc(1024);
WideCharToMultiByte
(CP_ACP
,
0, Text
,
-1, Buff
,
1024,
0,
0);
MessageBox
(0, Buff
,
"Buff: ",
0);
Buff2
= Cesar
(Buff
, Key
);
BSTR Ret
= SysAllocStringByteLen
(Buff2
, strlen
(Buff2
));
free
(Buff
);
free(Buff2);
return Ret
;
}

Private Declare Function EncryptCesar Lib "CryptoLib.dll" (ByVal Text As String, ByVal Key As Integer) As String

function Test() as string
Test = EncryptCesar(txtin.text, 13)
End Sub

Neo_Fr
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
End Function a la fin biensur

Neo_Fr
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
MessageBoxW(0, Text, L"Text:", 0);

C'est du UNICODE, on ne peut pas faire passer une chaine ascii pour du UNICODE avec un cast.

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Ou inversement comme dans ton cas (tu essais de faire passer une chaine unicode en ascii)

C++ (@++)<!--
Messages postés
87
Date d'inscription
jeudi 22 juin 2006
Statut
Membre
Dernière intervention
24 septembre 2007

Bonjour,

Si tu est sous Visual :

Dans les options de projet, change le jeu de caractère que tu utilise (dans général, presque tout en bas).

Je crois qu'il faut prendre le jeu de caractère multi-octet. De cette facon, tu pourra utiliser le "MessageBox" classique.


Phil