2016-09-03 4 views
3

Я создал библиотеку ActiveX C++. Когда я сделал свой кулак OCX, который подключается к сокете и проверяет соединение, а также читает сокет и записывает в гнездо. Вся функция работает, но функция (Чтение из сокета и отправка строки в контейнер ActiveX) возвращает тип BSTR (string), который не работал. после запуска проекта, когда этот код запускает программу, внезапно закрывается. Как я могу отправить данные, которые я прочитал из сокета в контейнер ActiveX с помощью этой функции?Почему программа C# закрыта, когда я использовал мой метод OCX со строковым возвращаемым типом?

//============ 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

Может быть, ваш выход пустой или поврежден. – MHM

+0

Я так не думаю. –

+2

Это, фактически. 'Read()' не правильно выделяет память для выходного BSTR. Используйте класс ['WideString'] (http://docwiki.embarcadero.com/Libraries/en/System.WideString), чтобы помочь вам:' return WideString (ch, 3) .Detach(); 'в противном случае вам нужно позвонить ['SysAllocStringLen()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms221639.aspx) напрямую: 'return SysAllocStringLen (ch, 3);' –

ответ

4

Моя проблема решена. При создании BSTR и передаче его между COM-объектами необходимо позаботиться о используемой памяти.

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

Ссылка: Allocating and Releasing Memory for a BSTR

+0

C++ Builder имеет класс 'WideString', который обертывает для вас управление памятью BSTR. –

+0

@RemyLebeau. Большое спасибо. –

Смежные вопросы