powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / GetSaveFileName - как задать имя файла при открытии?
52 сообщений из 52, показаны все 3 страниц
GetSaveFileName - как задать имя файла при открытии?
    #39468802
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте уважаемые Гуру!

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

В аналогичном диалоговом окне в С# есть возможность задать имя файла из переменной
при открытии окна.
А в С++ , в GetSaveFileName есть такая возможность?
Мои попытки поисков в структуре не увенчались успехом.
В гугле тоже не получилось найти. (может не так запрос делал...)
Я хочу сохранять изображения из массива в фал и чтобы имя файла
при открытии окна уже было записано в соответствующее поле.

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

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

Заранее всех благодарю.
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39468808
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл сказать что для сохранения файла я использую API WriteFile
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39468817
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39468820
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо заполнить структуру OPENFILENAME
Гугл в помощь
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469071
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, я вообще-то обращался за помощью к Гуру.

Гуру внимательно читают посты , а не кидают сходу ссылку на MSDN
У Гуру другая миссия.

Где лежит MSDN я и сам знаю.
И прежде чем просить помощи я всегда пытаюсь сам сначала разобраться
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469078
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArbitМои попытки поисков в структуре не увенчались успехом.искал без фонарика))
MSDN::OPENFILENAME structure lpstrFile
Type: LPTSTR
The file name used to initialize the File Name edit control.
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469083
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorych, Если у с получилось проинициализировать это поле структуры,
Не сочтите за труд,
Покажите пожалуйста всего одну строчку кода.
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469094
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArbitПокажите пожалуйста всего одну строчку кода.с выньапи одной строчкой не получится ))
Код: 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 );
...

как то так, не компилировал, мог наврать
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469101
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorych, Простите великодушно. Вы меня не совсем правильно поняли.
Повторюсь:
Если у Вас получится не только скомпилировать свой код, но и при открытии окна диалога
в поле имя файла обнаружить Hello world.txt, тогда я с благодарностью сниму шляпу
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469105
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArbitЕсли у Вас получится не только скомпилировать свой код, но и при открытии окна диалога
в поле имя файла обнаружить Hello world.txt, тогда я с благодарностью сниму шляпуну ё-моё
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
// getsavefilename_w32.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <windows.h>
#include "resource.h"
#include <Commdlg.h>

int APIENTRY _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow )
{
	UNREFERENCED_PARAMETER( hPrevInstance );
	UNREFERENCED_PARAMETER( lpCmdLine );

	OPENFILENAME ofn;
	const wchar_t *hello = L"hello world.txt";

	// a another memory buffer to contain the file name
	wchar_t szFile[ 255 ];
	wsprintf( szFile, L"%s", hello );

	// open a file name
	ZeroMemory( &ofn , sizeof( ofn ) );
	ofn.lStructSize = sizeof ( ofn );
	ofn.hwndOwner = NULL  ;
	ofn.lpstrFile = szFile ;
	ofn.nMaxFile = sizeof( szFile );
	ofn.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0";
	ofn.nFilterIndex =1;
	ofn.lpstrFileTitle = NULL ;
	ofn.nMaxFileTitle = 0 ;
	ofn.lpstrInitialDir=NULL ;
	ofn.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
	GetSaveFileName( &ofn );

	// Now simpley display the file name 
	MessageBox ( NULL , ofn.lpstrFile , L"File Name" , MB_OK);
	return 0;
}

приложение на C#, надеюсь, мне не придётся писать сейчас? ;)
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469110
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorych, действительно, снимаю шляпу!
Но мне нужна была всего одна строчка. Вот эта
wsprintf(szFile, L"%s", hello);
И тогда "ларчик просто открывался"
Спасибо большое!

Ну и осмелюсь спросить по поводу второго вопроса:
В какой кодировке записываются имена файлов на диске;
Мне нужно будет использовать латиницу, кирилицу и иврит
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469130
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArbitDima T, я вообще-то обращался за помощью к Гуру.

Гуру внимательно читают посты , а не кидают сходу ссылку на MSDN
У Гуру другая миссия.

Где лежит MSDN я и сам знаю.
И прежде чем просить помощи я всегда пытаюсь сам сначала разобраться
Я ссылку на гугл давал, там примеры заполнения OPENFILENAME. Собственно тоже самое что тебе egorych, но без использования юникода.

ИМХО У тебя проблема в том что ты не понимаешь как с юникодом работать, чем он отличается от ASCII-кодировок. Почитай что-нибудь на эту тему.
ArbitВ какой кодировке записываются имена файлов на диске;
Мне нужно будет использовать латиницу, кирилицу и иврит
NTFS хранит имена файлов в юникоде ( UTF-16 ) Виндовс тоже использует UTF-16 в качестве родной кодировки.
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469150
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArbitDima T, я вообще-то обращался за помощью к Гуру.

Гуру внимательно читают посты , а не кидают сходу ссылку на MSDN
У Гуру другая миссия.Какая у Гуру миссия? Завязывать шнурочки новичкам?
Тебе скинули ссылку на способ "завязывания шнурков" - учись "завязывать" самостоятельно.
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469162
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArbitМне нужно будет использовать латиницу, кирилицу и иврит
используйте явную юникод версию GetSaveFileNameW и OPENFILENAMEW
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469332
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArbitDima T, я вообще-то обращался за помощью к Гуру.

Гуру внимательно читают посты , а не кидают сходу ссылку на MSDN
У Гуру другая миссия.



Ребята, начинаем миссию "ГУРУ"!.
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469339
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbitegorych, действительно, снимаю шляпу!
Но мне нужна была всего одна строчка. Вот эта
wsprintf(szFile, L"%s", hello);
И тогда "ларчик просто открывался"
Спасибо большое!

Ну и осмелюсь спросить по поводу второго вопроса:
В какой кодировке записываются имена файлов на диске;
Мне нужно будет использовать латиницу, кирилицу и иврит

Имена файлов на диске в неизвестной кодировке, потому что это -- дело файловой системы.
А вот общаться с WinAPI ты должен в той кодировке, в которой работает приложение.
Там всё сложнее немного, чем ты себе представляешь.
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469351
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TNTFS хранит имена файлов в юникоде ( UTF-16 ) Виндовс тоже использует UTF-16 в качестве родной кодировки.

Но это вовсе не значит, что приложение обязано общаться с WinAPI именно в UTF-16.
А вовсе и наоборот, должно общаться в той кодировке, в которой оно настроено.
Например, это может быть cp866 для консольных приложений, или cp1251 для оконных.
Это для MBCS -приложений (см. документацию на tchar.h)

Для UNICODE-приложений это обычно кодировка UTF-16.

Но это вовсе не обязательно.
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469384
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivРебята, начинаем миссию "ГУРУ"!. Оффтоп:
Кто вообще завёл это определение (Гуру) в программировании? Введение экзистенциальных понятий в точных технических дисциплинах наводит на мысль, что кто-то что-то хотел втиснуть в индустрию (плохое слово, корень "индус"... отсюда, что ли, эти Гуры пошли?...), в сообщество мимо "проходной".
Кидание ссылки - это самый профессиональных ход, если не требуется каких-то технических уточнений со стороны отвечающего, которых не хватает в материале по ссылке.
Во-первых, это кратко.
Во-вторых, решает проблему (если нет, автор может вернуться за уточнениями)
В-третьих, экономит место и время. Всем.
Как могло так получится, что люди, выдающие лишние простыни текста (как я сейчас) вдруг стали экспертами?
Кстати, знаете, какая мне идея пришла, пока я всё это набирал, как надо отвечать на вопросы, если они требуют уточнения со стороны отвечающего:
- идёте к себе в блог, журнал, ещё куда-то.
- пишите вопрос и ответ с объяснениями там, в блоге/журнале
- возвращаетесь назад и оставляете ссылку на ответ в форуме
в результате, у вас +1 статья в бложике, и в следующий раз вам просто опять вызвать эту функцию оставить эту ссылку. Всё, как у программеров
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469403
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivдолжно общаться в той кодировке, в которой оно настроено.
Например, это может быть cp866 для консольных приложений

Ню-ню. Удачи с использованием ОЕМ кодировки в ANSI функциях.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469425
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivА вовсе и наоборот, должно общаться в той кодировке, в которой оно настроено.
независимо от настроек компиляции, приложение может обращаться как к UNICODE, так и к ANSI версиям API функций (указанием суффикса A или W в именах функций и структур)
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469464
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята, дорогие, ну чего вы в самом деле!
Совсем "помидорами закидали" :))

Ну захожу я сюда раз в месяц с конкретным вопросом...
Да, мне уже седьмой десяток лет...
Да, я вообще не технарь, а врач-психиатр и всю жизнь "завязываю шнурочки" и "вытираю сопельки"
всем страждущим и не сетую на это
Да. я постоянно стараюсь тренировать свои мозги - это профилактика надвигающеося маразма!
Простите меня за это!

Теперь о Гуру...
Во-первых это мое уважение к вашему Сообществу
Во-вторых Гуру - это Наставник

И благодаря вам, Гуру, я с нуля практически написал свое маленькое бизнес-приложение
на медицинскую тему
используя C# как пользовательский интерфейс, С++ как основной модуль программы (DLL)
PHP - автоматическая регистрация приложения на своем сайте, и SQL - база данных
И для меня - это еще один мой личный маленький успех в моем возрасте

Вопрос сохранения файла с именем на разных языках - последний не решенный в моем приложении.

Спасибо вам за то, что помогаете тянущимся к знаниям, независимо от их возраста!
Особая моя благодарность: Изопропил, Dimitry Sibiryakov!

Простите еще раз.
"Да не оскуднеет рука дающего"
Т
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469745
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbit
Ну захожу я сюда раз в месяц с конкретным вопросом...
Да, мне уже седьмой десяток лет...
Да, я вообще не технарь, а врач-психиатр и всю жизнь "завязываю шнурочки" и "вытираю сопельки"



Блин, предупреждать надо!
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469779
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,
Вы сожалеете что оказывали мне действенную помощь?
Я ведь не от нечего делать этим занимаюсь.
И мои скромные результаты дают мне добавку к пенсии ... кстати

Так что не сожалейте, СПАСИБО всем! :)
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469783
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArbitMasterZiv,
Вы сожалеете что оказывали мне действенную помощь?
Я ведь не от нечего делать этим занимаюсь.
И мои скромные результаты дают мне добавку к пенсии ... кстати

Так что не сожалейте, СПАСИБО всем! :)
Странный ты. Как будто тут сидят и ждут продвинутых пенсионеров. Тут проходит 100500 студентов желающих что бы им на халяву порешали их курсовые, потом чтобы за них поработали когда они на работу устроятся. Ты просто затерялся в этой толпе. MasterZiv правильно написал - обозначь себя и отношение в тебе будет другое.
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39469789
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,
Спасибо всем за понимание !!!
А беспокоить вопросами буду только когда своих мозгов не хватит разобраться.
Общение с умными людьми обогащает в прямом и переносном смысле :))
...
Рейтинг: 0 / 0
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
GetSaveFileName - как задать имя файла при открытии?
    #39473548
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
процесс передачи значений параметров при вызове unmanaged кода из managed - принято в той среде называть маршаллингом.

ArbitЯ ее получаю в C# из DLL на С++ маршаллингом
корректнее выразиться - посредством P/Invoke
...
Рейтинг: 0 / 0
GetSaveFileName - как задать имя файла при открытии?
    #39474670
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил, принял к сведению.
...
Рейтинг: 0 / 0
52 сообщений из 52, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / GetSaveFileName - как задать имя файла при открытии?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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