Вопрос по dll в С++

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить

Обмен данными с dll в char или string?

Опрос закончился 14 янв 2008, 21:55

string
0
Голосов нет
char
2
100%
другое
0
Голосов нет
 
Всего голосов: 2
galich
Сообщения: 8
Зарегистрирован: 16 окт 2007, 22:34

16 окт 2007, 22:51

1.Есть dll (win32) а приложение пишется на С++ NET т.е. с использованием Framework.
Мне необходимо передать путь к файлу из программы в dll но dll принимает char строку. Как перевести openFileDialog1->FileName в char?
2. В каком формате string или char вести обмен данными с dll (считывание и запись в файл)
Перерыл пол интернета а ответа так и не нашел.
Кинте ссылку на полное описание работы с dll :)
Albor
Сообщения: 482
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

17 окт 2007, 10:39

1. Преобразовать FileName в char-строку. (А какой тип у FileName)
2. В формате, который требует вызываемая функция.
galich
Сообщения: 8
Зарегистрирован: 16 окт 2007, 22:34

17 окт 2007, 17:14

В том то и дело что я не могу перевести в char.
openfiledialog->filename скорее всего string;
Albor
Сообщения: 482
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

24 окт 2007, 16:28

Наверное преобразовать к типу char* так просто не получится, поскольку тип char в Framework является структурой и, даже создав массив char-ов и скопировав туда строку, мы не получим требуемый тип. Я не имею опыта работы с NET Framework и могу заблуждаться, думаю, нужно как-то извратиться - выделить память, скопировать туда данные, учитывая что string содержит днные в Юникоде, и в функцию передать адрес первой ячейки.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

25 ноя 2007, 02:27

Для взаимодействия .NET с Win32 DLL ты наверняка используешь интеропы? Тогда не вижу проблемы. Интеропы должны сами делать преобразование.

Точнее ответить не могу , так как недостаточно информации. Дай куски кода и скажу более детально. Меня интересует декларация функции из Win32 DLL (имплементация не обязательна) и кусок кода из .NET, который её вызывает.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Анонимный Кысь
Сообщения: 2
Зарегистрирован: 26 апр 2010, 21:33

26 апр 2010, 21:37

у меня такая же проблема: если char name[]=System::Convert::ToChar(openFileDialog1->FileName); - то получается wchar_t.. и либо его дальше как то преобразовать либо что-то не так сделать?.. нужна обязательно чаровская строка потому как потом необходимо работать с fopen..
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

26 апр 2010, 23:36

Может лучше вместо fopen вызывать wfopen? :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
WinMain
Сообщения: 913
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

27 апр 2010, 00:43

Получить массив символов из строки можно с помощью метода ToCharArray().
Вот пример того, как это делается: http://forum.developing.ru/showthread.php?20549
Но дело в том, что в .NET тип char двухбайтовый, т.е. юникодный. Однобайтовые строки там не используются.
Поэтому нужно либо всё приложение писать в юникоде, либо использовать функции конвертации, типа MultiByteToWideChar() и WideCharToMultiByte().
Анонимный Кысь
Сообщения: 2
Зарегистрирован: 26 апр 2010, 21:33

27 апр 2010, 10:33

У меня наконец-то вроде заработало такое:

char* stringPointer = (char*) Marshal::StringToHGlobalAnsi(managedString ).ToPointer();

printf("stringPointer = %s\n", stringPointer);

// всегда удаляем unmanaged ресурсы
Marshal::FreeHGlobal(IntPtr(stringPointer));
Ответить