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

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

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

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

Заранее спасибо за ответ!
...
Рейтинг: 0 / 0
16.04.2004, 20:11
    #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
19.04.2004, 07:49
    #32485741
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глюки с языком
2 Lepsik

А на сях можно? :) Тоже на бис :)
...
Рейтинг: 0 / 0
30.04.2004, 20:59
    #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
05.05.2004, 08:06
    #32506786
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глюки с языком
А на MS VC? :) А то оно Т-классов этих не поймёт :)
...
Рейтинг: 0 / 0
10.05.2004, 18:42
    #32512239
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глюки с языком
тогда сделай VC совместимую dll на Borland и дергай ее и3 VC :)
...
Рейтинг: 0 / 0
12.05.2004, 13:14
    #32514668
zest
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глюки с языком
Как распространяешь ?
Такое проблемы легко решаются при помоши Windows Installer.
Например используя Install Shield .....
...
Рейтинг: 0 / 0
12.05.2004, 15:01
    #32514866
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глюки с языком
А нельзя ли сделать так, чтобы поддрежка шрифтов была вшита в саму программу, а то все дружбаны-то ставить запарятся.... =))

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

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

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

Жду ваших ответов...
...
Рейтинг: 0 / 0
23.12.2004, 22:34
    #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
24.12.2004, 07:49
    #32842967
Guest?
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глюки с языком
скажу одно
использовать картинки - это неоптимальный выбор
размер проги можеть пару раз увеличится ;)

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

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

я например храню шифрованный xml
...
Рейтинг: 0 / 0
25.10.2005, 22:09
    #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
Форумы / C++ [игнор отключен] [закрыт для гостей] / глюки с языком / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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