powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / GetSaveFileName - как задать имя файла при открытии?
25 сообщений из 52, страница 2 из 3
GetSaveFileName - как задать имя файла при открытии?
    #39469790
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кольцо власти жгло руку... Если-бы не Илья в топике то...
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469794
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArbitDima T,
Спасибо всем за понимание !!!
А беспокоить вопросами буду только когда своих мозгов не хватит разобраться.
Общение с умными людьми обогащает в прямом и переносном смысле :))
Пожалуйста!
Вопросы задавай. Тут любят на вопросы отвечать, но не студентам. Профессиональный эгоизм: "я через это сам прошел и ты будь добр сам". И это правильно, иначе студент никогда не станет профи.
Как уже написал: обозначай сразу что ты не профи и не студент. Так получишь понимание и полноценную помощь.
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469827
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychArbitПокажите пожалуйста всего одну строчку кода.с выньапи одной строчкой не получится ))
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
const wchar_t *savefilename = L"Hello world.txt"; // что-то, что пришло из вне
...
OPENFILENAME ofn;
...
wchar_t filename[255]; // число взято от балды, никогда не знаешь, сколько надо зарезервировать :) сюда ведь ещё будет записан результат
wsprintf( filename, "%s", savefilename );
ofn.lpstrFile = LPTSTR( &filename );
...

как то так, не компилировал, мог наврать
Предлагаю в пятницу обсудить 255.

Раньше, во время ДОС, этого хватало гарантированно.

Сейчас MAX_PATH и то может не хватить - до 32800 растянули.

Вроде и стек жалко (хотя там уже 1Мб), и потенциальный эксплойт создавать не хоцца.

Что делать то правильно ?

(Как сделали основатели в C#, не смотрел)
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469830
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglСейчас MAX_PATH и то может не хватить - до 32800 растянули.
260 как и много лет назад
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469832
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CreateFile

In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this limit to 32,767 wide characters, call the Unicode version of the function and prepend "\\?\" to the path.

а тараканы из всех щелей лезут
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469855
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArbitMasterZiv,
Вы сожалеете что оказывали мне действенную помощь?:)

да нет, ровно наоборот.
если человек - профессионал и спрашивает такое - это свидетельство профессиональной некомпетентности и провод для грусти.
Если же это типа хобби, то все понятно и объяснимо.
я потом ещё сделаю review твоего вопроса, по сути редкостный бред, я хочу объяснить, почему.
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469862
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Arbit]Здравствуйте уважаемые Гуру!

ну, давай устроим детальный разбор полетов...

Собственно, sabj.

А в С++ , в GetSaveFileName есть такая возможность?

вообще, этот изначальный вопрос не стоит даже выеденного яйца. Там четко написано в документации, что вЫходной параметр - он также и Входной
Там пишешь дефолт, и он работает. на выходе получаешь итоговый результат.

И второй вопрос, в какой кодировке должно быть имя в переменной,
чтобы оно правильно записалось на диск при условии что имена могут быть
не только на латинице , но и в кирилице , а также на иврите ...


Имя переменной в С++ может быть только в Latin1..

Имена будут браться из С# в DataGridViev и передаваться в DLL C++ как string .
Приниматься будут в DLL как const wchar_t*


тут какой-то полный бред, потому как string - это char, а не wchar_t, а wchar_t - это wstring
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469877
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv, спасибо.
Поскольку программирование - это для души, то я мыслю не как профессионал
Это понятно.

Вопрос про о наличии дефолта- я читал документацию. Я понимал что все должно быть.
Но на практике я получал исключение.
Когда egorych мне показал код, я увидел ту строчку которой мне не хватало.
Надо было перегнать из const wchar_t перегнать просто в массив wchar_t*

Что касается второго вопроса - тут я просто не совсем ясно выразился, но Изопропил понял меня
Он мне много помогал уже.
Я имел ввиду что в C# в прототипе переменная уходит как string , а принять в С++ ее ведь можно
и как const char* и как const wchar_t* если я правильно понял. Во всяком случае в проекте я принимал и так и так
в разных участках.

У меня слабое звено для понимания - это вопрос кодировки в момент обмена данных между menaged/unmenaged кодом
Я бы хотел попросить помочь один раз и навсегда понять схему эту.

Поясню что я имею ввиду и как я делаю. а Вы поправьте меня пожалуйста

В проекте я постоянно гоняю данные С#->C++->sQLite или MySQL и обратно.
Я не использую для этого библиотеку базы под С# все делаю в С++ а готовый результат вывожу в C#

Если я передаю строки в базу, (а строки идут на кирилице, латинице и иврите), то в шарпе я сначала пакую string
в base64-строку
, в С++ принимаю как const char*, перевожу в std::string распаковываю,кое-что шифрую и отдаю в базу.
При этом с кодировкой ничего не делаю , так как все сделано в шарпе через
Код: c#
1.
2.
3.
4.
5.
public static string Base64EncodeString(string plainText)
{
      var plainTextBytes = Encoding.UTF8.GetBytes(plainText);
      return Convert.ToBase64String(plainTextBytes);
}


и в базу нормально идет и иврит и кирилица.

Если выборка из базы, то собираю XML строку пригодную для записи в DataTable
и маршалингом передаю массив в шарп. В DataGridViev тоже все языки нормально ложаться.

А вот когда реализовывал задачу загрузки в базу изображений и выгрузки их из базы на диск,
обнаружил неодинаковое поведение.

Выбирал файлы для загрузки диалоговым окном из шарповского класса
передавал полный путь в stringt без паковки base64 , принимал как const wchar_t*
и передавал в CreateFileW . И загружал благополучно файлы с именами на любом языке.
Никаких манипуляций с кодировками не требовалось

А вот когда начал сохранять на диск, то наткнулся на грабли:
Имя файла для установки в дефолт шарповского диалогового окна я брал из грида
А если я правильно понимаю, то кодировка в данном случае UTF16.

После получения полного пути файла из шарповского окна (аналогично загрузке), принимаю в С++
как const wcar_t* - и получаю иероглифы на латинице и кирилице и исключение при иврите.
Понял, что путь к файлу при загрузке и путь к файлу при сохранении в разных кодировках

Пока вышел из положения так:
беру имя файла из грида, без base64 отдаю в С++. Там принимаю в const char*
перевожу в wchar_t* вот таким образом;
bstr_t temp = _bstr_t(PathFiles.c_str());
wchar_t* FName = temp.operator wchar_t *();

и устанавливаю дефолтом в диалоговое окно С++ .
При этом сохраняются имена только на латинице и кирилице.
На иврите получается по дефолту ????.gpg и окно дальше не пропускает на сохранение

Пробовал предварительно в шарпе паковать в base64 и принимать как const char* а затем использовать MultiByteToWideChar но не получилось

Понимаю что в голове сумбур, и так никто не делает. Самому разобраться пока сложно.
Разницу между юникодом и ASCII, однобайтовой и многобайтовой кодировкой понимаю,
Но с правильным использованием соответствующих инструментов для этого
у меня пока проблема

Получилось слишком длинно. Извините
Вопросы по другим темам пока в основном удается разобрать самостоятельно.
Иногда обращаюсь на форум
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469897
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbitберу имя файла из грида, без base64 отдаю в С++. Там принимаю в const char*
вот здесь и потеряли всё кроме "ANSI"
Arbit bstr_t temp = _bstr_t(PathFiles.c_str());

из грида UNICODE тащить нужно.

как я предполагаю - c# вызывает C-dll , а в параметрах маршаллинга задано преобразование в ANSI (явно или неявно)

фрагмент кода давайте
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469970
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил, добрый день!

Я снимаю шляпу перед Вами. И могу сказать только одно:
Медицина потеряла замечательного врача-диагноста!!!
автор в параметрах маршаллинга задано преобразование в ANSI (явно или неявно)
Это- объявление в С# при загрузке изображений
Код: c#
1.
2.
[DllImport(@"D:\ProjectsC#\PodologSQLite\Debug\base.dll", CharSet = CharSet.Unicode)]
public static extern int DLL_InsertImages(string ClientID, string VisitID, string PathFiles);


А это - при сохранении на диск
Код: c#
1.
2.
[DllImport(@"D:\ProjectsC#\PodologSQLite\Debug\base.dll")]
public static extern int DLL_SaveImage(string KeyBinary, string PathDir);


Я забыл ЯВНО указать кодировку

Теперь буду знать, что по умолчанию всегда стоит ANSI.

Спасибо огромное!
Не случайно я выбрал Вас в качестве своего Наставника !
Вопрос закрыт.

Вот это и есть наставничество:
Конкретный вопрос -> диагностика ->конкретный ответ
Как всегда - СУПЕР!

Хороших выходных!
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39470261
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbit
У меня слабое звено для понимания - это вопрос кодировки в момент обмена данных между menaged/unmenaged кодом
Я бы хотел попросить помочь один раз и навсегда понять схему эту.

это вопрос скорее по C#
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39470276
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivArbitУ меня слабое звено для понимания - это вопрос кодировки в момент обмена данных между menaged/unmenaged кодом
Я бы хотел попросить помочь один раз и навсегда понять схему эту.

это вопрос скорее по C#
он смежный, а понимания внутренних механизмов здесь поболее
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39470317
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну будь здоров док. У нас тут конешно не Кащенко но тоже забавные топики бывают.
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39471851
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbit, а есть какие-нибудь подобные форумы для врачей-психиатров? Я бы почитал


Btw, Гуру - духовный наставник, а не технический :)
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39472672
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CEMb, приветствую Вас!

"MSDN " для российских психиатров :))
Но там при регистрации на форуме в статусе специалиста нужно будет кроме прочей информации об образовании
загрузить скан диплома.

Можно и без диплома, но.... как пациент :))

А на практике, врачи обычно читают профессиональные зарубежные и отечественные монографии
и ездят на тематические конференции.
У нас другая специфика. Студенты и средний мед персонал в этом вопросе живут отдельной жизнью.
Со студентами работают только в ВУЗe.
Это минимум 7 лет обучения, а потом еще минимум 2 если узкая специализация

Средний медперсонал дрючат в мед училище, а потом всю трудовую деятельность в лечебном учреждении

Все ТОЛЬКО ОЧНО!!! :))

Я не знаю, наверное этот пост оффтоп. Не хочу попасть в бан, я очень дорожу помощью форумчан!
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39472675
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39472688
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArbitЯ не знаю, наверное этот пост оффтоп. Не хочу попасть в бан, я очень дорожу помощью форумчан!
Тут правила достаточно либеральные, если других не оскорблять забанят максимум топик за уход от темы.

А если тема интересная и не раскрытая, то думаю модераторов можно уговорить не закрывать. А тема именно такая, т.к. ваше врачебное сообщество "вещь в себе", т.е. знает что делает, но никому не говорит, а когда делает толком ничего не поясняет. Лично мне было очень интересно узнать тонкости перед тем как меня будут резать, но все что я нагуглил это мнения пациентов с похожими болячками, потом хирург снимавший швы удивился: "где ты этой хрени начитался? Нормальные доктора в инет не пишут."
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39472723
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, Может сначала спросить разрешение у модераторов, прежде чем забанят? :))
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39473401
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил, добрый вечер!

Опять я наступил на грабли в связке C#->C++->C#...
Как обычно строка из базы SQLite идет в C# через DLL C++
Кодировка в базе UTF8
В DLL результат селекта преобразуется в XML -строку и отдается в С# как BSTR
В C# принимается вот так
Код: c#
1.
2.
3.
[DllImport(@"D:\ProjectsC#\PodologSQLite\Debug\base.dll")]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern string DLL_Select(string QueryName, string WhereValues, ref int  CountRows);


Все работает как обычно и замечательно. НО
Если строка в базе содержит управляющие символы \r\n, то они при выводе строки в MessageBox С#
передаются просто как символы - перевода каретки не происходит.

Еще заметил, что в С# если переменной присваивается строка вот так
Код: c#
1.
msgText = "Запись не может быть удалена,\r\nтак как содержит сведения о визитах.\r\n\r\n";


то каретка переводится, а если так
Код: c#
1.
msgText = @"Запись не может быть удалена,\r\nтак как содержит сведения о визитах.\r\n\r\n";


то перевод каретки не работает
Как я понимаю префикс @ означает что строка юникодная. Значит из DLL идет юникодная строка (BSTR)

А MessageBox в такой строке не принимает управляющие символы
Во что перегнать строку?

Заранее благодарю
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39473420
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArbitКак я понимаю префикс @ означает что строка юникодная. Значит из DLL идет юникодная строка (BSTR)

Юникод тут ни при чем. Это наследие консольного Си.
В C# @ означает читать как написано, т.е. \r это '\' и 'r', а не перейти в начало строки. Просто убери @ если надо перейти в начало строки.

Это сделано для написания путей. Чтобы вместо убогого
Код: plaintext
1.
"c:\\test.txt"


можно было написать по-нормальному
Код: plaintext
1.
@"c:\test.txt"
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39473451
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, Спасибо.
С @ - все понятно.
Но у меня проблема со строкой, которую я получаю из базы.
В базе она лежит как:
"Запись не может быть удалена,\r\nтак как содержит сведения о визитах.\r\n"
Я ее получаю в C# из DLL на С++ маршаллингом
Как мне ее преобразовать, чтобы MessageBox понял "\r\n " как управляющие символы
и перевел "каретку".
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39473488
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArbitЯ ее получаю в C# из DLL на С++ маршаллингомНе надо путать передачу данных с маршаллингом. Это несколько разные сущности.
Путать термины вообще не полезно. Профессиональный психиатр же не будет путать шизофрению с расщеплением личности? :)

ArbitКак мне ее преобразовать, чтобы MessageBox понял "\r\n " как управляющие символы и перевел "каретку".C# и C++ это два очень разных языка, их тоже не нужно путать. Проблемы C# обсуждаются в соседнем форуме: http://www.sql.ru/forum/dotnet
И гугл никто не отменял, первая же ссылка дает много информации: c# carriage return in message box
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39473512
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl, Спасибо за участие.
авторПрофессиональный психиатр же не будет путать шизофрению с расщеплением личности?
Вы правы, профессиональный - точно не будет :))

Вы наверное удивитесь, но в переводе с древнегреческого
шизофрения и есть дословно - расщепление ума,
Заболевание проявляющееся распадом личности

Теперь по существу моего вопроса
авторC# и C++ это два очень разных языка, их тоже не нужно путать
Видимо Вы не совсем поняли мой вопрос,
который находится на "стыке" этих двух языков
Строка написаная в C# и в MessageBox отображаемая с переносом строки
Код: c#
1.
string msgText = "Запись не может быть удалена,\r\nтак как содержит сведения о визитах.\r\n\";


не идентична строке, Запись не может быть удалена,\r\nтак как содержит сведения о визитах.\r\n\
которую я получаю в переменную С# из базы через DLL на С++
В этой связи я и спрашиваю:
Как преобразовать строку в DLL так, чтобы она, попав в С#
правильно отобразилась в MessageBox.

Еще раз - Строку для MessageBox я не готовлю в С#!!!
и мне совершенно не понятно пока почему одна и та же строка, сделанная в C#
и полученная из DLL ведет себя по разному в MessageBox?
Может все-таки важно в какой кодировке передаются управляющие символы в данной строке?

У меня мультиязычное приложение и локализация находится в базе.
А сообщения в MessageBox - многострочные.
Можно было бы, как вариант, разделить строку сообщения в базе с помощбю сепаратора и
передать в C# и там рампарсить и склеить заново средствами C#
Но может есть более рациональное правильное и красивое решение?

А пользоваться гуглом я умею.
Ваши ссылки тоже, к сожалению, не дают ответа,
потому что находятся не в плоскости заданного вопроса
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39473516
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос закрыт
Оказалось что при передаче из unmenage в menager код, добавляется автоматом дополнительный слэш:
и вместо строки "\r\n" в шарп идет "\\r\\n".
Replace в C# решил вопрос.
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39473518
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,
ArbitЯ ее получаю в C# из DLL на С++ маршаллингом
White OwlНе надо путать передачу данных с маршаллингом. Это несколько разные сущности.
Путать термины вообще не полезно. Профессиональный психиатр же не будет путать шизофрению с расщеплением личности? :)
"Маршалинг (от англ. marshal — упорядочивать) в информатике — процесс преобразования информации (данных, двоичного представления объекта), хранящейся в оперативной памяти, в формат, пригодный для хранения или передачи. Процесс похож на сериализацию (отличия см. ниже). Обычно применяется тогда, когда информацию (данные, объекты) необходимо передавать между различными частями одной программы или от одной программы к другой."

Вот этот самый маршаллинг я и использую при передаче данных из unmenaged в menaged код ;))
...
Рейтинг: 0 / 0
25 сообщений из 52, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / GetSaveFileName - как задать имя файла при открытии?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]