Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Передать строку из С++ в С#


Автор: Competitor 8.9.2007, 14:47
Привет всем.
Сделал dll'ку на С++, которая работает с WMI и выдает на выход какую-то строку типа BSTR. Я импортирую эту дллку с свой основной проект на C#. Как мне передать значение из С++ дллки в C#, чтобы там оно нормально прочиталось.
Допустим метод в С++ на экспорт выглядит так:
Код


private:
    BSTR bstrData;

extern "C" __declspec(dllexport) BSTR GetData()
{
    return bstrData
}

А в C# метод импорта выглядит так:
Код

        [DllImport("Test1.dll")]
        public static extern string GetData();

При таком написании вываливается ошибка записи в память. Подскажите плиз как решить эту проблему?

Автор: Fazil6 8.9.2007, 15:15
Цитата(Competitor @  8.9.2007,  14:47 Найти цитируемый пост)
Подскажите плиз как решить эту проблему?

решение проблемы заключается в использовании интерфейса dll только встроенных типов.
Код

extern "C" __declspec(dllexport) BSTR GetData()

импорт такой функции возможен только в приложении, скомпиллированным темже компиллятором что и библиотека, причем тойже версии и с теми же настройками, иначе ничего не гарантируется. Потому, что возвращается объект. Для передачи строк используй char*.

Автор: Competitor 8.9.2007, 16:07
Fazil6, спасибо за подсказку.
А как тогда сконвертить BSTR в char*.

Автор: Fazil6 8.9.2007, 19:52
Цитата(Competitor @  8.9.2007,  16:07 Найти цитируемый пост)
А как тогда сконвертить BSTR в char*.

думаю, что тебе надо не конвертация, тут надо думать о выделении и заполнении буфера. Как вариант
Код

extern "C" __declspec(dllexport) unsigned int GetData(char *buffer   // адрес начала некоего буфера
                                                                                       , unsigned int bufferSize  // размер этого буфера
                                                                                       )
{
    
      // заполняем буфер и возвращаем длину реально записанной строки в буфер
}

вообще конкретное решение может быть и иным и это зависит от конкретики решаемой задачи

Автор: akizelokro 10.9.2007, 08:13
Это вопрос не из общих, а из MC++.

http://msdn.microsoft.com/msdnmag/issues/02/08/CQA/

Зачти, глянь какой тип идет по умельчанию для string. Преобразуй к нему. Или попробуй отмаршализовать BSTR (которая организуется типо (не путать с "типа") указатель на буфер, где сначала длина строки, а затем уже байты текстовухи).


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)