Passer un LPCSTR de VC++ à VB

Radium The Hammer Messages postés 6 Date d'inscription mardi 27 avril 2004 Statut Membre Dernière intervention 19 août 2005 - 10 août 2005 à 18:38
Radium The Hammer Messages postés 6 Date d'inscription mardi 27 avril 2004 Statut Membre Dernière intervention 19 août 2005 - 19 août 2005 à 11:34
Bonjour,

comme vous vous en doutez j'ai un problème de programmation.

j'ai créé un fichier ocx avec VC++ que j'utilise dans VB comme bibliothèque.

Dans mon ocx je voudrais créer une fontion qui renvoit une string que je pourrais récupérer dans une variable VB.

Le problème est que je n'arrive pas à récupérer cette variable. Dans l'autre sens il n'y a aucun problème, les paramètres

des fonctions de l'ocx donné dans VB fonctionne très bien.



lorsque je fais afficher la valeur dans une msgbox dans vb j'obtiens des ??????



Je vous donne la fonction que j'utilise dans VC++

LPCSTR maclasse::GetResponse( VOID )

{

return (LPCSTR)Response.c_str();

}

Response étant une string dont je set la valeur par ailleurs
(si j'affiche la valeur de Response depuis le C++ la valeur est
correcte).



pour déclarer ma fonction dans le fichier .cpp j'utilise

DISP_FUNCTION(maclasse, "GetResponse", GetResponse, VT_BSTR, VTS_NONE)



pour déclarer ma fonction dans le fichier .h j'utilise

afx_msg LPCSTR GetResponse ( void);

et

dispidGetResponse = 48L,



dans mon fichier odl j'utilise

[id(48)] BSTR GetResponsereceived ( void);



l'appelle dans VB est le suivant

MsgBox myDisp.GetSCAreceived()



si quelqu'un a une idée je suis preneur.

j'espère avoir était assez clair mais si ce n'est pas le cas n'hésitez pas à me demander plus de détail



Merci

6 réponses

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

ciao...
BruNews, MVP VC++
0
Radium The Hammer Messages postés 6 Date d'inscription mardi 27 avril 2004 Statut Membre Dernière intervention 19 août 2005
11 août 2005 à 16:10
Merci pour le lien (que je n'avais pas trouvé, j'avais pourtant cherché avant de poster)

mais ça ne marche pas avec mon ocx.

j'ai changé ma fonction qui renvoit ma valeur créer en C++ par

return SysAllocString((BSTR)Resp->GetResponse().c_str());


et j'ai changé tous les LPCSTR en BSTR mais j'obtiens toujours des ?? dans la messagebox.



je pense que la différence peut venir du fait que je n'utilise pas une dll mais un ocx.

je ne peux pas changer et utiliser une dll, c'est imposé dans mon stage.



je précise aussi que cette erreur n'arrive que pour des string car les bool et les long passent très bien de l'ocx au vb.



si tu as une autre idée spécifique au ocx ou si tu pense que je n'ai pas fait les bons changements ça m'intéresse.

Sinon tant pis et merci quand même.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 août 2005 à 16:24
SysAllocString((BSTR)Resp->GetResponse().c_str());
c'est quoi ce cast mystique (BSTR) ???


Procède donc sur ce modèle:
BSTR __stdcall bnGetWinDir()
{
char buff[260];
DWORD len;
len = GetWindowsDirectory(buff, 260);
if(!len) buff[0] = 0;
return SysAllocStringByteLen(buff, len);
}

ciao...
BruNews, MVP VC++
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
11 août 2005 à 16:31
Pas bien le cast. Utilise plutot un reinterpret_cast() pour laisser ton compilateur C++ vérifier ta sauce.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 août 2005 à 16:46
Mais il n'y a rien à vérifier, il faut de l'OLECHAR unicode à SysAllocString et pas autre chose.

ciao...
BruNews, MVP VC++
0
Radium The Hammer Messages postés 6 Date d'inscription mardi 27 avril 2004 Statut Membre Dernière intervention 19 août 2005
19 août 2005 à 11:34
je n'ai pas réussi avec les méthodes que vous m'avez donné

mais en utilisant la fonction suivante pour convertir ça marche.

je converti ma string avec la fonction suivante et j'envoie le BSTR obtenu dans VB et ça marche.

si j'ai bien compris cela converti ma string en unicode.





BSTR maclasse::convert2unicode( string ansi_string)

{

int lenA = lstrlenA((LPCSTR)ansi_string.c_str());

int lenW;

BSTR unicodestr;



lenW = ::MultiByteToWideChar(CP_ACP, 0, (LPCSTR)ansi_string.c_str(), lenA, 0, 0);

// Check whether conversion was successful

unicodestr = ::SysAllocStringLen(0, lenW);

::MultiByteToWideChar(CP_ACP, 0, (LPCSTR)ansi_string.c_str(), lenA, unicodestr, lenW);



return unicodestr;

}

Merci pour votre aide
0
Rejoignez-nous