Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передать строку из С++ в С# 
:(
    Опции темы
Competitor
Дата 8.9.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 23.3.2005
Где: Tula

Репутация: нет
Всего: -1



Привет всем.
Сделал 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();

При таком написании вываливается ошибка записи в память. Подскажите плиз как решить эту проблему?
PM MAIL WWW   Вверх
Fazil6
Дата 8.9.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



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

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

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

импорт такой функции возможен только в приложении, скомпиллированным темже компиллятором что и библиотека, причем тойже версии и с теми же настройками, иначе ничего не гарантируется. Потому, что возвращается объект. Для передачи строк используй char*.
PM MAIL   Вверх
Competitor
Дата 8.9.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 23.3.2005
Где: Tula

Репутация: нет
Всего: -1



Fazil6, спасибо за подсказку.
А как тогда сконвертить BSTR в char*.
PM MAIL WWW   Вверх
Fazil6
Дата 8.9.2007, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



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

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

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

вообще конкретное решение может быть и иным и это зависит от конкретики решаемой задачи
PM MAIL   Вверх
akizelokro
Дата 10.9.2007, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Это вопрос не из общих, а из MC++.

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

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




--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0437 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.