2016-09-03 2 views
3

J'ai créé une bibliothèque ActiveX du générateur c + +. Quand j'ai fait mon premier OCX qui se connecte à la prise et vérifie la connexion et aussi lire de la prise et écrire sur le socket. Toutes les fonctions fonctionnent mais la fonction (Lire à partir du socket et envoyer la chaîne au conteneur ActiveX) renvoie le type BSTR (chaîne) qui ne fonctionne pas. après l'exécution du projet lorsque ce code a exécuté le programme soudainement fermé. Comment puis-je envoyer des données que j'ai lues depuis un socket vers un conteneur ActiveX avec cette fonction?pourquoi le programme C# est fermé lorsque j'ai utilisé ma méthode OCX avec le type de retour de chaîne?

//============ c++ builder xe8================ 
//I change the code to just return simple output"123" 
//but it can not retun and c# program closed 
BSTR STDMETHODCALLTYPE TSock4Impl::Read() 
{ 
    WCHAR ch[10]; 
    ch[0]='1'; 
    ch[1]='2'; 
    ch[2]='3'; 
    return ch; 
} 
//=============c# code ================ 
private void Form1_Load(object sender, EventArgs e) 
{ 
    //label1.Text = axVinaSock41.Read(); 
     int a = axSock41.ConStatus(); 
     label1.Text = Convert.ToString(a); 
     label1.Text = axVinaSock41.Read();// in this line the program was closed. 
} 

enter image description here

+0

Peut-être que votre sortie est nulle ou endommagé. – MHM

+0

Je ne pense pas. –

+2

C'est en fait. 'Read()' n'alloue pas correctement la mémoire pour le BSTR de sortie. Utilisez la classe ['WideString'] (http://docwiki.embarcadero.com/Libraries/fr/System.WideString) pour vous aider à:' renvoyer WideString (ch, 3) .Detach(); 'sinon vous devez appeler ['SysAllocStringLen()'] (https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms221639.aspx) directement: 'return SysAllocStringLen (ch, 3);' –

Répondre

4

Mon problème est résolu. Lorsque vous créez un BSTR et que vous le passez entre des objets COM, vous devez prendre soin de la mémoire qu'il utilise.

BSTR STDMETHODCALLTYPE TSock4Impl::Read() 
{ 
    WCHAR ch[10]; 
    ch[0]=L'1'; 
    ch[1]=L'2'; 
    ch[2]=L'3'; 
    return ::SysAllocStringLen(ch, 3); 
} 

Référence: Allocating and Releasing Memory for a BSTR

+0

C++ Builder a une classe 'WideString' qui enveloppe la gestion de la mémoire BSTR pour vous. –

+0

@RemyLebeau. Merci beaucoup. –