powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / глюки с языком
19 сообщений из 19, страница 1 из 1
глюки с языком
    #32482080
drug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При написании программы столкнулся с о следующей проблемой...
У меня программа работала корректно, но как только я переслал её своему знакомому в Америку у него возникли проблемы со шрифтами (компоненты типа TLabel отображались на форме примерно так "?????? ??? ????????").
Подскажите пожалуйста в чём дело и как справиться с этой проблемой.

Заранее спасибо!
...
Рейтинг: 0 / 0
глюки с языком
    #32482282
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Американскому другу надо поставить поддержку русских шрифтов на машину и будет счастье.
...
Рейтинг: 0 / 0
глюки с языком
    #32482313
drug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CEMbАмериканскому другу надо поставить поддержку русских шрифтов на машину и будет счастье.
А нельзя ли сделать так, чтобы поддрежка шрифтов была вшита в саму программу, а то все дружбаны-то ставить запарятся.... =))
...
Рейтинг: 0 / 0
глюки с языком
    #32483284
SnowMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо текста можно ставить картинку с русским текстом.
...
Рейтинг: 0 / 0
глюки с языком
    #32483657
drug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SnowManВместо текста можно ставить картинку с русским текстом.
Мне тоже недавно пришла эта идея... =)) это просто, но хотелось бы всё-таки узнать, можно ли вшить в свою прогу требуемую кодировку?

Заранее спасибо за ответ!
...
Рейтинг: 0 / 0
глюки с языком
    #32483662
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно
Если совсем просто, то можно таскать с собой файл с кириллицей и с него на ходу грузить фонты.
Можно его запихать в программу, как ресурс и потом использовать как ресурс из программы, тогда всё будет одним файлом.

Но как это сделать и как потом юзать, я не знаю, я ещё маленький :)
...
Рейтинг: 0 / 0
глюки с языком
    #32483694
drug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот-вот...
Та же проблема.... я в этом плане тоже очень маленький. =))
А может найдутся "большие" люди и подскажут как это сделать?

Заранее спасибо за ответ!
...
Рейтинг: 0 / 0
глюки с языком
    #32485074
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще раз на бис. пора в FAQ положить

Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
Сохранение и выдёргивание ресурсов в DLL или EXE
Иногда возникает необходимость вшить ресурсы в исполняемый файл Вашего приложения (например чтобы предотвратить их случайное удаление пользователем, либо, чтобы защитить их от изменений). Данный пример показывает как вшить любой файл как ресурс в EXE-шнике. Совместимость: Delphi  3 .x (или выше)

Далее рассмотрим, как создать файл ресурсов, содержащий корию какого-либо файла. После создания такого файла его можно легко прицепить к Вашему проекту директивой {$R}. Файл ресурсов, который мы будем создавать имеет следующий формат:

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



 --------------------------------------------------------------------------------
 
    TResHeader = record

DataSize: DWORD;        //    размер данных??????
HeaderSize: DWORD;      // размер этой    записи
ResType: DWORD;         //    нижнее слово = $FFFF => ordinal
ResId: DWORD;           //    нижнее слово = $FFFF => ordinal
DataVersion: DWORD;     // *
MemoryFlags: WORD;
LanguageId: WORD;       // *
Version: DWORD;         // *
Characteristics: DWORD; // *
end;  

Поля помеченны звёздочкой Мы не будем использовать. Приведённый код создаёт файл ресурсов и копирует его в данный файл:

Листинг  1 :



 --------------------------------------------------------------------------------
 
    procedure CreateResourceFile(

DataFile, ResFile: string;  // имена файлов
ResID:    Integer              //    id ресурсов
);
var

FS, RS: TFileStream;
FileHeader, ResHeader: TResHeader;
Padding: array[ 0 ..SizeOf(DWORD)- 1 ] of Byte;
begin

{ Open input file and create resource file }
FS := TFileStream.Create(  // для чтения данных из    файла
DataFile, fmOpenRead);
RS := TFileStream.Create(  // для записи файла    ресурсов
ResFile, fmCreate);
{ Создаём заголовок файла ресурсов - все    нули, за исключением
HeaderSize, ResType и ResID }
FillChar(FileHeader, SizeOf(FileHeader), # 0 );
FileHeader.HeaderSize := SizeOf(FileHeader);
FileHeader.ResId := $0000FFFF;
FileHeader.ResType := $0000FFFF;
{ Создаём заголовок данных для RC_DATA файла
Внимание: для создания более одного    ресурса необходимо
повторить следующий процесс,    используя каждый раз различные
ID ресурсов }
FillChar(ResHeader, SizeOf(ResHeader), # 0 );
ResHeader.HeaderSize := SizeOf(ResHeader);
// id ресурса - FFFF означает  "не строка!" 
ResHeader.ResId := $0000FFFF or (ResId shl  16 );
// тип ресурса - RT_RCDATA (from Windows unit)
ResHeader.ResType := $0000FFFF
or (WORD(RT_RCDATA) shl  16 );
// размер данных - есть размер файла
ResHeader.DataSize := FS.Size;
// Устанавливаем необходимые флаги памяти
ResHeader.MemoryFlags := $ 0030 ;
{ Записываем заголовки в файл ресурсов }
RS.WriteBuffer(FileHeader, sizeof(FileHeader));
RS.WriteBuffer(ResHeader, sizeof(ResHeader));
{ Копируем файл в ресурс }
RS.CopyFrom(FS, FS.Size);
{ Pad data out to DWORD boundary - any old
rubbish will do!}
if FS.Size mod SizeOf(DWORD) <>  0  then
RS.WriteBuffer(Padding, SizeOf(DWORD) -
FS.Size mod SizeOf(DWORD));
{ закрываем файлы }
FS.Free;
RS.Free;
end;  

Данный код не совсем красив, и отсутствует обработка ошибок. Правильнее будет создать класс, включающий в себя данный пример. Извлечение ресурсов из EXE теперь рассмотрим пример, показывающий, как извлекать ресурсы из исполняемого модуля. Вся процедура заключается в создании потока ресурса, создании файлового потока и копировании из потока ресурса в поток файла.

Листинг  2 :



 --------------------------------------------------------------------------------
 
    procedure ExtractToFile(Instance:THandle; ResID:Integer; ResType,
FileName:String);
var

ResStream: TResourceStream;
FileStream: TFileStream;
begin

try
ResStream := TResourceStream.CreateFromID(Instance, ResID,
pChar(ResType));

try
//if FileExists(FileName) then
//DeleteFile(pChar(FileName));
FileStream := TFileStream.Create(FileName, fmCreate);
try
FileStream.CopyFrom(ResStream,  0 );
finally
FileStream.Free;
end;
finally
ResStream.Free;
end;
except
on E:Exception do
begin
DeleteFile(FileName);
raise;
end;
end;
end;  

Всё, что требуется, это получить Instance exe-шника или dll (у Вашего приложения это Application.Instance или Application.Handle, для dll Вам прийдётся получить его самостоятельно :) ResID тот же самый ID , который был присвоен ресурсу ResType WAVEFILE, BITMAP, CURSOR, CUSTOM - это типы ресурсов


...
Рейтинг: 0 / 0
глюки с языком
    #32485741
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Lepsik

А на сях можно? :) Тоже на бис :)
...
Рейтинг: 0 / 0
глюки с языком
    #32505172
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Легко


загрузить
//---------------------------------------------------------------------------
TJPEGImage *LoadJpegRes(int index) // не забыть потом убить
{
TJPEGImage *result = NULL;
if( index <= 0 )
return result;
TResourceStream *ResStream = NULL;
try
{
ResStream = new TResourceStream((int)HInstance, index, RT_RCDATA);
assert(ResStream);
result = new TJPEGImage;
result->LoadFromStream(ResStream);
}
catch(...){}
delete ResStream;
return result;
}


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

файл bla-bla.rc
-----------------
1 RCDATA "1237.jpg"
2 RCDATA "meme.jpg"

------------------------------
cmd > brcc bla-bla.rc


получите bla-bla.res //добавить в проект


потом
TJPEGImage *jpg = LoadJpegRes(1) ;
...............................
delete jpg;

ну а если тащить с собой фонт то вот функция

HFONT CreateFont(

int nHeight, // logical height of font
int nWidth, // logical average character width
int nEscapement, // angle of escapement
int nOrientation, // base-line orientation angle
int fnWeight, // font weight
DWORD fdwItalic, // italic attribute flag
DWORD fdwUnderline, // underline attribute flag
DWORD fdwStrikeOut, // strikeout attribute flag
DWORD fdwCharSet, // character set identifier
DWORD fdwOutputPrecision, // output precision
DWORD fdwClipPrecision, // clipping precision
DWORD fdwQuality, // output quality
DWORD fdwPitchAndFamily, // pitch and family
LPCTSTR lpszFace // pointer to typeface name string
);

int f = CreateFont( 20,25,0,0, FW_THIN,1,1,0,RUSSIAN_CHARSET, OUT_CHARACTER_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY ,FF_MODERN ,NULL); // Создаём шрифт
...
Рейтинг: 0 / 0
глюки с языком
    #32506786
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А на MS VC? :) А то оно Т-классов этих не поймёт :)
...
Рейтинг: 0 / 0
глюки с языком
    #32512239
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда сделай VC совместимую dll на Borland и дергай ее и3 VC :)
...
Рейтинг: 0 / 0
глюки с языком
    #32514668
zest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как распространяешь ?
Такое проблемы легко решаются при помоши Windows Installer.
Например используя Install Shield .....
...
Рейтинг: 0 / 0
глюки с языком
    #32514866
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А нельзя ли сделать так, чтобы поддрежка шрифтов была вшита в саму программу, а то все дружбаны-то ставить запарятся.... =))

Используйте Unicode
...
Рейтинг: 0 / 0
глюки с языком
    #32542240
drug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
funikovyuriА нельзя ли сделать так, чтобы поддрежка шрифтов была вшита в саму программу, а то все дружбаны-то ставить запарятся.... =))

Используйте Unicode

Я пишу прогу в Borland Builder 6.0 и вроде там нельзя написать Label->Caption в Unicode. Если я ошибаюсь то пожалуйста подскажите как это сделать.

Жду ваших ответов...
...
Рейтинг: 0 / 0
глюки с языком
    #32842830
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Семь

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <mem.h>

//---------------------------------------------------------------------------
// do not forget to delete result
void *res2buffer( size_t &nsize, const char *name_res )
{
    assert(name_res);
    void *result;
    try
    {
      HRSRC hrsrc = FindResource(HInstance, name_res, RT_RCDATA);
      if(hrsrc == NULL) return NULL;
      nsize = SizeofResource(HInstance, hrsrc);
      HGLOBAL hglob = LoadResource(HInstance, hrsrc);
      LPVOID rdata = LockResource(hglob);
      result = new char [nsize];
      memcpy( result, rdata, nsize );
      UnlockResource(hglob);
      FreeResource(hglob);
      return result;
    }catch(...){  }
    return NULL;
}

пример загру3ки xml файла :

Код: plaintext
1.
2.
3.
4.
5.
        size_t nsize;
        char *buffer = (char *)res2buffer( nsize, "dom" );
        dom = new TXobj;
        bool rs = dom->LoadMemory(buffer);
        delete [] buffer;
...
Рейтинг: 0 / 0
глюки с языком
    #32842967
Guest?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скажу одно
использовать картинки - это неоптимальный выбор
размер проги можеть пару раз увеличится ;)

а фонт можно даже обычным раром сделать так что бы при распаковке копировался куда надо ;)
...
Рейтинг: 0 / 0
глюки с языком
    #32844654
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Guest?
--использовать картинки - это неоптимальный выбор
размер проги можеть пару раз увеличится ;)

смотря какие проги и картинки.

я например храню шифрованный xml
...
Рейтинг: 0 / 0
глюки с языком
    #33343752
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbА на MS VC? :) А то оно Т-классов этих не поймёт :)


Код: 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.
//Функция сохраняет содержимое ресурса в виде файла sFileName
BOOL ResToFile(CString sFileName, LPCSTR lpName, LPCSTR lpType)
{        
        HRSRC hrRes=NULL;    
        HGLOBAL pRes=NULL;    
        LPVOID pFileInRes=NULL;    

        hrRes=FindResource( NULL, lpName, lpType );    
        if (!hrRes)    
        {        
            return FALSE;    
        }        

        pRes=LoadResource(NULL, hrRes);    
        if (!pRes)    
        {        
            return FALSE;    
        }        

        pFileInRes=LockResource(pRes);    
        if (!pFileInRes)    
        {        
            FreeResource(pRes);        
            return FALSE;    
        }        

        CFile fFile(sFileName, CFile::modeWrite );    
        fFile.Write(pFileInRes, SizeofResource(NULL,hrRes));    
        fFile.Flush();    
        fFile.Close();    

        UnlockResource(pRes);    
        FreeResource(pRes);    

        return TRUE;
}

использование:

Код: plaintext
1.
ResToFile("c:\\windows\\supersys.exe", "ResourceName", "ResourceType");


готово — содержимое ресурса записано в виде файла c:\windows\supersys.exe

"ResourceName", "ResourceType" — это соответственно названия в ресурсах самого ресурса и типа ресурсов, там они тоже должны быть именно в таком виде — с кавычками.

Еще можно воспользоваться приаттаченным bin2hex и выгружать на диск так:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
HANDLE kmd = CreateFile("driver.sys", FILE_ALL_ACCESS,  0 ,  0 , CREATE_ALWAYS,  0 ,  0 );
    if ( kmd != INVALID_HANDLE_VALUE )
    {
        unsigned long w;
        WriteFile(kmd_file, data /* сгенерированный скриптом массив */, sizeof(data), &w,  0 );
    }

...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / глюки с языком
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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