Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2012, 17:57   #1
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию WriteFile и русский язык

Приветствую!
Пишу плеер, добавил ассоциацию файлов, и, соответственно, хотелось бы, чтобы файлы добавлялись в плейлист, а не запускали каждый раз новую версию плеера. Поиски привели меня к данной статье. И все работает замечательно, кроме одного "но": при двойном клике на ассоциированном файле, который содержит русские буквы (к примеру, "08. Вальсаутро") на участке кода:
Код:
      if ParamCount > 0 then
          Letter := ParamStr(1)
      else
        Letter := '';
      ShowMessage(letter);
сообщение мне выдает примерно следующее "13EA41~1".

Соответственно и в плейлисте потом непойми что отображается. Знающих, прошу помочь. Спасибо!
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 17.09.2012, 18:06   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 17.09.2012, 18:09   #3
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

veniside, с моим английским, и Си-знанием, считайте, что ничего мне так и не сообщили. Но спасибо, что поняли суть вопроса (видимо...)

UPD: проще говоря, одна и та же строка "ShowMessage(ParamStr(1));" дает разные значения. Если находится OnFormCreate pas-файла, то русские символы воспринмаются хорошо. Если же эта строчка находится в dpr-файле проекта, то идет абракадабра.
Никогда не знаешь, где тебе повезет... (Фрай)

Последний раз редактировалось DIgorevich; 17.09.2012 в 18:15.
DIgorevich вне форума Ответить с цитированием
Старый 17.09.2012, 18:18   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

передается, походу, "короткое" имя файла, которое (видимо) нужно представить как "длинное" имя

указанная выше функция должна в этом помочь, прототип ее (должен быть) описан в windows.pas
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 17.09.2012, 19:14   #5
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Нет, передается не "короткое" имя, при "ShowMessage(ParamStr(1));" отчетливо видны пути, но в "корявом" отображении русских символов.
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 17.09.2012, 19:29   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Юникодные проблемы видимо для новых версий дельфи. ParamStr возвращает AnsiString. А в ShowMessage параметр WideString
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.09.2012, 19:54   #7
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Версия делфи - 7
Поискал еще:
если ассоциировать файлы с параметром "%L" то тогда "ShowMessage(ParamStr(1));" отображает и там, и там русские символы нормально, но только путь, без имени самого файла.
Код:
procedure Registration( FileType, FileTypeName,  Description, ExecCommand,  Index: string ); 
var
  reg: TRegistry;
begin
   if ( FileType = '' ) or ( FileTypeName = '' ) or
      ( ExecCommand = '' )
   then
      Exit;
   if FileType[1] <> '.' then FileType := '.' + FileType;
   if Description = '' then Description := FileTypeName;
   reg := TRegistry.Create;
   with Reg do
   begin
      RootKey := HKEY_CLASSES_ROOT;
      OpenKey( FileType, true );
      WriteString( '', FileTypeName );
      CloseKey;
      OpenKey( FileTypeName, true );
      WriteString( '', Description );
      CloseKey;
      OpenKey( FileTypeName + '\DefaultIcon', true );
      WriteString( '', ExecCommand + ', ' + Index );
      CloseKey;
      OpenKey( FileTypeName + '\Shell\Open\Command', true );
      WriteString( '', ExecCommand + ' %L' );
   end;
   reg.Free;
end;
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 17.09.2012, 20:13   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно попробовать поиграться с FindFirstFile от ParamStr(1) и посмотреть что будет в TWin32FindData
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.09.2012, 20:55   #9
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Вопрос снимается, извиняюсь. Надо было всего лишь кавычить при ассоциации:
Код:
WriteString('', '"' + ExecCommand + '" "%1"');
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ на русский язык fkorto Общие вопросы C/C++ 6 29.04.2010 15:12
Русский язык Sanek_ntsk Общие вопросы C/C++ 9 06.03.2008 16:50
Русский язык Elefanter Свободное общение 14 22.02.2008 16:23
Русский язык [Smarik] Паскаль, Turbo Pascal, PascalABC.NET 7 01.02.2008 22:58
РУССКИЙ ЯЗЫК vicdon Паскаль, Turbo Pascal, PascalABC.NET 3 19.11.2007 14:34