1.Есть dll (win32) а приложение пишется на С++ NET т.е. с использованием Framework.
Мне необходимо передать путь к файлу из программы в dll но dll принимает char строку. Как перевести openFileDialog1->FileName в char?
2. В каком формате string или char вести обмен данными с dll (считывание и запись в файл)
Перерыл пол интернета а ответа так и не нашел.
Кинте ссылку на полное описание работы с dll
Вопрос по dll в С++
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
1. Преобразовать FileName в char-строку. (А какой тип у FileName)
2. В формате, который требует вызываемая функция.
2. В формате, который требует вызываемая функция.
В том то и дело что я не могу перевести в char.
openfiledialog->filename скорее всего string;
openfiledialog->filename скорее всего string;
Наверное преобразовать к типу char* так просто не получится, поскольку тип char в Framework является структурой и, даже создав массив char-ов и скопировав туда строку, мы не получим требуемый тип. Я не имею опыта работы с NET Framework и могу заблуждаться, думаю, нужно как-то извратиться - выделить память, скопировать туда данные, учитывая что string содержит днные в Юникоде, и в функцию передать адрес первой ячейки.
- Romeo
- Сообщения: 3091
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Для взаимодействия .NET с Win32 DLL ты наверняка используешь интеропы? Тогда не вижу проблемы. Интеропы должны сами делать преобразование.
Точнее ответить не могу , так как недостаточно информации. Дай куски кода и скажу более детально. Меня интересует декларация функции из Win32 DLL (имплементация не обязательна) и кусок кода из .NET, который её вызывает.
Точнее ответить не могу , так как недостаточно информации. Дай куски кода и скажу более детально. Меня интересует декларация функции из Win32 DLL (имплементация не обязательна) и кусок кода из .NET, который её вызывает.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
-
- Сообщения: 2
- Зарегистрирован: 26 апр 2010, 21:33
у меня такая же проблема: если char name[]=System::Convert::ToChar(openFileDialog1->FileName); - то получается wchar_t.. и либо его дальше как то преобразовать либо что-то не так сделать?.. нужна обязательно чаровская строка потому как потом необходимо работать с fopen..
- Romeo
- Сообщения: 3091
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Может лучше вместо fopen вызывать wfopen?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Получить массив символов из строки можно с помощью метода ToCharArray().
Вот пример того, как это делается: http://forum.developing.ru/showthread.php?20549
Но дело в том, что в .NET тип char двухбайтовый, т.е. юникодный. Однобайтовые строки там не используются.
Поэтому нужно либо всё приложение писать в юникоде, либо использовать функции конвертации, типа MultiByteToWideChar() и WideCharToMultiByte().
Вот пример того, как это делается: http://forum.developing.ru/showthread.php?20549
Но дело в том, что в .NET тип char двухбайтовый, т.е. юникодный. Однобайтовые строки там не используются.
Поэтому нужно либо всё приложение писать в юникоде, либо использовать функции конвертации, типа MultiByteToWideChar() и WideCharToMultiByte().
-
- Сообщения: 2
- Зарегистрирован: 26 апр 2010, 21:33
У меня наконец-то вроде заработало такое:
char* stringPointer = (char*) Marshal::StringToHGlobalAnsi(managedString ).ToPointer();
printf("stringPointer = %s\n", stringPointer);
// всегда удаляем unmanaged ресурсы
Marshal::FreeHGlobal(IntPtr(stringPointer));
char* stringPointer = (char*) Marshal::StringToHGlobalAnsi(managedString ).ToPointer();
printf("stringPointer = %s\n", stringPointer);
// всегда удаляем unmanaged ресурсы
Marshal::FreeHGlobal(IntPtr(stringPointer));