не могу вытащить string из управляемого кода
От: sect0id  
Дата: 28.01.11 08:00
Оценка:
Здравствуйте! столкнулся с проблемой вытаскивания строки из c# в с++...

есть код на c#

namespace MyInterop
{
public interface IMyDotNetInterface2
{
int Add(int Number1, int Number2);
[return: MarshalAs(UnmanagedType.BStr)] string say();

public class MyDotNetClass : IMyDotNetInterface2
{

public string say()
{
return "OK";
}

public int Add(int Number1,int Number2)
{
return Number1+Number2;
}
}
}
}

не могу вытащить "OK" из функции say();
пробовал так:
Код C++

myfunc(){
CoInitialize(NULL);
MyInterop::IMyDotNetInterface2Ptr pDotNetCOMPtr2(__uuidof(MyDotNetClass));

long lResult = 0;
pDotNetCOMPtr2->Add(5,10, &lResult);
myfile<<"\nCOM5="<<lResult; //тут всё ок

BSTR test_lResult = SysAllocString(L"");
pDotNetCOMPtr2->say(&test_lResult);
myfile<<"\nCOM6="<<test_lResult; //тут выводит "00070F84"
}

подскажите пожалуйста как вытащить string? буду очень благодарен, спасибо.
Re: не могу вытащить string из управляемого кода
От: Centaur Россия  
Дата: 28.01.11 11:13
Оценка: +1
Здравствуйте, sect0id, Вы писали:

S>        BSTR test_lResult = SysAllocString(L"");
S>        pDotNetCOMPtr2->say(&test_lResult);
S>        myfile<<"\nCOM6="<<test_lResult; //тут выводит "00070F84"

S>подскажите пожалуйста как вытащить string? буду очень благодарен, спасибо.

Для начала добиться, чтобы поток myfile, в который производится запись юникодной строки test_lResult, был юникодным и корректно записывал юникодные строки.
Re: не могу вытащить string из управляемого кода
От: KokorinS Россия  
Дата: 28.01.11 11:14
Оценка: +1
//managed c++ class
public ref class Something
public:
    void manageString(String^ string) {
      pin_ptr<const wchar_t> str = PtrToStringChars(string);
      pure_cpp_class->manageString((const wchar_t*)str);
    }
private:
PureCPPClass *pure_cpp_class;
};


вызывается из c# со стандартным типом строк.

Здравствуйте, sect0id, Вы писали:

S>Здравствуйте! столкнулся с проблемой вытаскивания строки из c# в с++...


S>есть код на c#


S>namespace MyInterop

S>{
S> public interface IMyDotNetInterface2
S> {
S> int Add(int Number1, int Number2);
S> [return: MarshalAs(UnmanagedType.BStr)] string say();

S> public class MyDotNetClass : IMyDotNetInterface2

S> {

S> public string say()

S> {
S> return "OK";
S> }

S> public int Add(int Number1,int Number2)

S> {
S> return Number1+Number2;
S> }
S> }
S> }
S>}

S>не могу вытащить "OK" из функции say();

S>пробовал так:
S>Код C++

S>myfunc(){

S> CoInitialize(NULL);
S> MyInterop::IMyDotNetInterface2Ptr pDotNetCOMPtr2(__uuidof(MyDotNetClass));

S> long lResult = 0;

S> pDotNetCOMPtr2->Add(5,10, &lResult);
S> myfile<<"\nCOM5="<<lResult; //тут всё ок

S> BSTR test_lResult = SysAllocString(L"");

S> pDotNetCOMPtr2->say(&test_lResult);
S> myfile<<"\nCOM6="<<test_lResult; //тут выводит "00070F84"
S>}

S>подскажите пожалуйста как вытащить string? буду очень благодарен, спасибо.
Re: не могу вытащить string из управляемого кода
От: Вертер  
Дата: 29.01.11 16:22
Оценка:
S> BSTR test_lResult = SysAllocString(L"");
S> pDotNetCOMPtr2->say(&test_lResult);
S> myfile<<"\nCOM6="<<test_lResult; //тут выводит "00070F84"

хм, а преобразовывать тут ничего не надо?
кусок моей функции:
void myFunc(System::String^ strParams)
{
 using namespace msclr::interop;
 marshal_context^ context = gcnew marshal_context();
 const wchar_t* szString = context->marshal_as<const wchar_t*>(strParams);
 ...
 // szString
 ...
 delete context;
}
Re: не могу вытащить string из управляемого кода
От: sect0id  
Дата: 31.01.11 07:12
Оценка:
Здравствуйте, sect0id, Вы писали:

Спасибо за ответы господа, буду пробовать!


S>Здравствуйте! столкнулся с проблемой вытаскивания строки из c# в с++...


S>есть код на c#


S>namespace MyInterop

S>{
S> public interface IMyDotNetInterface2
S> {
S> int Add(int Number1, int Number2);
S> [return: MarshalAs(UnmanagedType.BStr)] string say();

S> public class MyDotNetClass : IMyDotNetInterface2

S> {

S> public string say()

S> {
S> return "OK";
S> }

S> public int Add(int Number1,int Number2)

S> {
S> return Number1+Number2;
S> }
S> }
S> }
S>}

S>не могу вытащить "OK" из функции say();

S>пробовал так:
S>Код C++

S>myfunc(){

S> CoInitialize(NULL);
S> MyInterop::IMyDotNetInterface2Ptr pDotNetCOMPtr2(__uuidof(MyDotNetClass));

S> long lResult = 0;

S> pDotNetCOMPtr2->Add(5,10, &lResult);
S> myfile<<"\nCOM5="<<lResult; //тут всё ок

S> BSTR test_lResult = SysAllocString(L"");

S> pDotNetCOMPtr2->say(&test_lResult);
S> myfile<<"\nCOM6="<<test_lResult; //тут выводит "00070F84"
S>}

S>подскажите пожалуйста как вытащить string? буду очень благодарен, спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.