PDA

Показать полную графическую версию : [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели


Страниц : 1 [2]

Admiral
02-10-2009, 14:03
Drongo погуглив (другим участникам напомню, в настоящие время не использую среду разработки от Борланда) вышел на то, что в Борланде возможно пройдёт такой код extern "C"int WINAPI wWinMain
В настройка проекта где-то должен быть пункт про использования Юникода. Так же в параметрах передачи линковщику, если есть присутствующий WinMain, должен быть заменён на wWinMain (что-то на подобии /ENTRY:wWinMain), кроме этого bcc должен быть передан параметр -WU.
Borland WinMain patch (http://trac.wxwidgets.org/ticket/9110) (Англ.)
Help please with UNICODE linking (http://www.mombu.com/programming/pascal/t-help-please-with-unicode-linking-1555136.html) (Англ.)
[hr]
Борландская функция FileGetAttr как и Win32 APIшная GetFileAttributes определяет общие характеристики файла, как было замечено: Архивный, скрытый и т.д.
Для определения CompanyName нужно использовать тандем сразу трёх функций GetFileVersionInfoSize, GetFileVersionInfo, VerQueryValue
Неплохой пример лежит здесь GetFileVersion (http://www.tech-archive.net/Archive/VC/microsoft.public.vc.language/2006-01/msg00151.html)
Вместо TEXT("\\") вероятно нужно использовать TEXT("\\CompanyName ") или что-то наподобие (http://msdn.microsoft.com/en-us/library/ms647464(VS.85).aspx).
Хочу ещё раз заметить, что патчи могут использовать более простой алгоритм определения языка системы (сильно не копал в этом направлении, может через System Metrics?).

Ну, а вместо передачи абсолютного адреса лучше его определять для текущей системы. Пример здесь (http://forum.oszone.net/post-1079652.html#post1079652).
Так как в ХР данная папка легко меняется (в файле ответов Winnt.sif (http://forum.oszone.net/thread-47582.html) секция [Unattended] параметр TargetPath), в Висте и выше с помощью файла ответов AutoUnattend.xml (http://forum.oszone.net/thread-128794.html)(секция <DiskConfiguration> (http://www.oszone.net/8588) пример (http://forum.oszone.net/thread-102669.html)) можно переназначит диск, ну а с папкой сейчас разбираются (http://forum.oszone.net/thread-149479.html).
A и W в конце имени функций стоит использовать в случаях, когда параметры могут передаваться только в одном виде, во всех остальных случаях их подстановку стоит регулировать определением (#define UNICODE| #define _UNICODE) или не определением Юникода.

Drongo
02-10-2009, 15:22
В настройка проекта где-то должен быть пункт про использования Юникода. »Не поверите, не нашёл ничего в настройках по поводу Юникода.
вышел на то, что в Борланде возможно пройдёт такой код extern "C"int WINAPI wWinMain »Да, спасибо, но это не решило проблему, возможно я не так делаю, вот код. Ошибка та же.
#include <vcl.h>
#pragma hdrstop
#include <windows.h>

#ifndef UNICODE
#define UNICODE
#endif

#ifndef _UNICODE
#define _UNICODE
#endif

#if !(defined(_UNICODE) | defined(UNICODE))
#error no Unicode!
#endif

//---------------------------------------------------------------------------
USEFORM("Test1.cpp", Form1);
//---------------------------------------------------------------------------
extern "C" int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------

Параллельно заглянул в обучение, по статьям которым я начинал изучать C++Builder 6.0 - Шаг 90 - Исправление ошибок, связанных с настройками проектов (http://www.firststeps.ru/cbuilder/r.php?90). Так же не помогло.

В гугле ищу по этой ошибке, сообщений много, большая часть на английском, но все какие-то не понятные.

Наверное придётся отложить до лучших времён этот вопрос, боюсь, что я его сам не осилю.

Admiral
02-10-2009, 23:20
Drongo, а что если к параметрам функции присмотреться
в обычной WinMain параметр LPSTR, а в wWinMain - LPTSTR >> (http://forum.vingrad.ru/forum/s/7ee2bc5a362af97df535a97fdc491b52/topic-253396.html)
Может дело в этом?
Когда только переводил с WinMain на wWinMain среда от Микрософт кажись ругнулся на него.
На мысль подтолкнула эта тема Перенос проекта из 6 в 2009, WinMain -> wWinMain (http://forum.vingrad.ru/forum/s/7ee2bc5a362af97df535a97fdc491b52/topic-253396.html)
Ещё вариант: открыть пустой проект (в Борланде есть такой проект: не консольный и не GUI?) или попробовать компилить с консоли, быть может там найдётся подходящий параметр.

Drongo
03-10-2009, 12:08
Может дело в этом? »Увы, в моём случае, нет. Изменения в параметрах не устранили ошибку.

Ещё вариант: открыть пустой проект (в Борланде есть такой проект: не консольный и не GUI?) »Пустой проект это обычный cpp файл, который не компилируется? Если да, то такой есть, хотя формы куда размешать кнопки и др. компоненты, нету.

Drongo
07-10-2009, 13:24
В общем, вопрос с Кириллицей в WIN32 GUI приложениях отчасти решился переходом на C++ Builder 2009. :)

Помечаю вопрос как решённый, но если кто-то что-то откопает, милости прошу, отписывайтесь, буду признателен. :yes:

Drongo
14-10-2009, 14:25
В общем, вопрос с Кириллицей в WIN32 GUI приложениях отчасти решился переходом на C++ Builder 2009. »Итак, отчаявшись найти решение, задал вопрос ещё на нескольких форумах. Вопросов было два:

1. Иногда при выполнении какой-либо операции в программе, нужно на метку (Label, GroupBox и т.д) вывести другой текст, не тот, который был изначально.
2. Сохранение русского текста содержащегося в Memo в файл, чтобы сохранился нормальный русский текст, а не знаки вопросов.

Первый вопрос:
1-е решение:
Добавляем параметр "L"
...
GroupBox1->Caption = L"Выбрали "+ ComboBox1->Text;;
Button1->Caption = L"Вернуть";
...
2-е решение:
Немного сложнее, используем

unit ReConst;

interface

uses Windows;

resourcestring
TEXTGroupBox1 = 'Выбрали';
TEXTButton1 = 'Вернуть';
TitleError = 'Внимание: Ошибка!';
TEXTError1 = 'Неправильное значение!';
TEXTError2 = 'Выберите пункт меню.';
//--------------------------------------------------
implementation

end.

Как мне сказали, редактировать ReConst.hpp без смысла, т.к. Borland его генерирует по reconst.pas, но его нужно подключать:
...
#include "ReConst.hpp"
...
// CodeGear C++Builder
// Copyright (c) 1995, 2008 by CodeGear
// All rights reserved

// (DO NOT EDIT: machine generated header) 'Reconst.pas' rev: 20.00

#ifndef ReconstHPP
#define ReconstHPP

#pragma delphiheader begin
#pragma option push
#pragma option -w- // All warnings off
#pragma option -Vx // Zero-length empty class member functions
#pragma pack(push,8)
#include <System.hpp> // Pascal unit
#include <Sysinit.hpp> // Pascal unit
#include <Windows.hpp> // Pascal unit

//-- user supplied -----------------------------------------------------------

namespace Reconst
{
//-- type declarations -------------------------------------------------------
//-- var, const, procedure ---------------------------------------------------
extern PACKAGE System::ResourceString _TEXTGroupBox1;
#define Reconst_TEXTGroupBox1 System::LoadResourceString(&Reconst::_TEXTGroupBox1)
extern PACKAGE System::ResourceString _TEXTButton1;
#define Reconst_TEXTButton1 System::LoadResourceString(&Reconst::_TEXTButton1)
extern PACKAGE System::ResourceString _TitleError;
#define Reconst_TitleError System::LoadResourceString(&Reconst::_TitleError)
extern PACKAGE System::ResourceString _TEXTError1;
#define Reconst_TEXTError1 System::LoadResourceString(&Reconst::_TEXTError1)
extern PACKAGE System::ResourceString _TEXTError2;
#define Reconst_TEXTError2 System::LoadResourceString(&Reconst::_TEXTError2)
} /* namespace Reconst */
using namespace Reconst;
#pragma pack(pop)
#pragma option pop

#pragma delphiheader end.
//-- end unit ----------------------------------------------------------------
#endif // ReconstHPPК проекту подключаем (Project -> Add to Project <Shift + 11>) - reconst.pas.


...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
GroupBox1->Caption = (UnicodeString)Reconst_TEXTGroupBox1;
Button1->Caption = Reconst_TEXTButton1;
Button2->Caption = Reconst_TEXTButton2;
Label1->Caption = Reconst_TEXTLabel1;
UnicodeString TextError = Reconst_TEXTError1 + "\n" + Reconst_TEXTError2;
Application->MessageBox(TextError.w_str(), Reconst_TitleError.w_str(), MB_YESNO+MB_ICONWARNING);
}
...


Компилируем. :) Полный пример привожу в архиве. Среда разработки C++ Builder 2009
[hr]
Второй вопрос:
Чтобы сохранить русский текст из Memo в файл и чтобы содержимое файла отображалось правильно, а не знаками ?????, нужно добавить второй параметр к функции SaveToFile("MyFile.txt", TEncoding::Unicode)
...
Memo1->Lines->SaveToFile("SaveFile.txt", TEncoding::Unicode);
...
Как мне сказали, нужно указывать вторым параметром соответствующую кодировку:
TEncoding::Unicode
TEncoding::UTF8
TEncoding::Default
TEncoding::ASCII
[hr]
Вопрос решён!!! :yahoo:




© OSzone.net 2001-2012