Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Функции GetComputerName, GetUserNameA




    

Функция GetComputerName возвращает NetBIOS имя локального компьютера.

 

BOOL GetComputerName(

LPTSTR lpBuffer, // имя локального компьютера [out]

LPDWORD lpnSize // размер буфера         [out/in]

);

 

Размер буфера lpBuffer лучше задать равным MAX_COMPUTERNAME_LENGTH + 1.

 

Функция GetUserName возвращает имя текущего пользователя.

 

BOOL GetUserName(

LPTSTR lpBuffer, // имя пользователя (размер буфера UNLEN + 1 ) [out]

LPDWORD nSize // размер буфера (лучше задать равным UNLEN + 1 ) [out/in]

);

 

Возвращаемые значения:

Если функции вызваны правильно, то они возвращают не нулевое значение (TRUE).

Если функции вызваны не правильно, то они возвращают 0 (FALSE).

Пример:

char ComputerName[MAX_COMPUTERNAME_LENGTH + 1];

unsigned long len_ComputerName = MAX_COMPUTERNAME_LENGTH + 1;

char UserName[UNLEN + 1];

unsigned long len_UserName = UNLEN + 1;

BOOL comp = GetComputerName(

ComputerName,

&len_ComputerName

);

if( comp != 0 ) { cout << "Computer Name is " << ComputerName << endl; }

else cout << "Computer Name is NOT FOUND !!! " << endl;

comp = GetUserNameA (

UserName,

&len_UserName

);

if( comp != 0 ) { cout << "User Name is " << UserName << endl; }

else cout << "User Name is NOT FOUND !!! " << endl;

 

Функции GetSystemDirectory, GetTempPath, GetWindowsDirectory, GetCurrentDirectory

 

 

Функция GetSystemDirectory возвращает путь к системному каталогу.

 

UINT GetSystemDirectory(

LPTSTR lpBuffer, // буфер для системного каталога [out]

UINT uSize     // размер буфера[in]

);

 

Возвращаемое значение:

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

Если функция вызвана не правильно, то она возвращает 0.

 

 

Функция GetTempPath возвращает путь к каталогу, отведённому для временных файлов.

 

DWORD GetTempPath(

DWORD nBufferLength, // размер буфера [in]

LPTSTR lpBuffer  // буфер для временного каталога [out]

);

 

Возвращаемое значение:

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

Если функция вызвана не правильно, то она возвращает 0.

 

Функция GetWindowsDirectory возвращает путь к каталогу Windows.

 

UINT GetWindowsDirectory(

 LPTSTR lpBuffer, // буфер для каталога Windows [out]

 UINT uSize   // размер буфера [in]

);

 

Возвращаемое значение:

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

Если функция вызвана не правильно, то она возвращает 0.

 

 

Функция GetCurrentDirectory возвращает путь к текущему каталогу.

 

DWORD GetCurrentDirectory(

DWORD nBufferLength, // размер буфера  [in]

LPTSTR lpBuffer  // буфер для текущей директории [out]

);

 

Возвращаемое значение:

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

Если функция вызвана не правильно, то она возвращает 0.

 

Пример:

char path[100];

GetSystemDirectory( path, 100 );

cout << "System Directory is " << path << endl;

GetTempPath( 100, path );

cout << "Temp path is " << path << endl;

GetWindowsDirectory( path, 100 );

cout << "Windows directory is " << path << endl;

GetCurrentDirectory( 100, path );

cout << "Current directory is " << path << endl;

 

Функция GetSystemInfo

 

Функция GetSystemInfo возвращает адрес структуры, содержащей информацию о системе.

 

VOID GetSystemInfo(

LPSYSTEM_INFO lpSystemInfo // адрес структуры, содержащей информацию

// о системе

);

 

Функция не возвращает никакого значения.

Параметр: 

lpSystemInfo – указатель на структуру SYSTEM_INFO, которую заполняет функция.

 

Пример использования функции GetSystemInfo (и еще многих других) содержится в проекте SysInfo_Demo. Авторы: Alexey Kazakovsky, Stas Khirman и Raz Galili.



Разное-всякое

Русификация приложений

Речь идет, прежде всего, о русификации приложений, разрабатываемых в Visual C++ 6.0, хотя многое относится и к приложениям, разрабатываемым в аналогичной среде другой версии, например, Microsoft Visual Studio 2005 или 2008.

Русификация консольных приложений.

Для того чтобы можно было выводить символы кириллицы на монитор (например cout<<”Покупайте память!”;), надо поступить таким образом:

char s[]="Покупайте память!";

CharToOemA(s,s); // переводит из кодировки Windows в кодировку DOS

cout<<s<<endl;

 

Такое преобразование символов с помощью функции CharToOemA необходимо потому, что в тексте программы символы кириллицы записаны в кодировке Windows (1251), а при выводе на монитор (в консольном приложении) они должны быть заданы в кодировке MS DOS (866). С англоязычными символами никаких проблем нет потому, что первые 128 символов в обеих кодировках совпадают, а именно в этой группе и находятся буквы английского языка (см. подраздел «Кодировки и кодовые страницы»).

.

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

char s[129];

cin>>s; // вводим “Сало”

cout<<s; // выводит “Сало”

 

Из соображений удобства можно написать такую простую функцию перекодировки для консольных приложений:

char Buf[1024]; /*предполагается, что длина преобразуемой строки не будет превышать 1024. В реальной программе надо бы предусмотреть проверку длины обрабатываемой строки либо выполнять локализацию вообще по-иному*/

char * Rus(char *Str)

{

CharToOemA(Str,Buf);

return Buf;

}

 

Надо заметить, что в этом примере явно указана ANSI-версия функции CharToOemA(), а не версия для Unicode. Версия для Unicode имеет другое имя – CharToOemW().

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

cout<<Rus(“Баба Яга - королева красоты!”)<<endl;

 

Способы русификации консольных приложений зависят от того, какой набор символов (character set) предполагается использовать в приложении: ANSI, Unicode или MBCS. Этот набор символов надо установить в свойствах проекта: команда меню ProjectèProperties, а далее выбираем Configuration PropertiesèGeneral и нужное значение для Character Set в правой панели. (рис.4.1). Более подробные сведения по русификации, с примерами, можно найти в подразделе данного конспекта «Использование ini-файла».

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

 

Рис. 4.1. Выбор кодировки символов для проекта

 

В программе символы Unicode или строки таких символов описывают с помощью идентификаторов wchar_t или TCHAR, например:

wchar_t WBuf[1024]=_T(”Заткнигузно”);

TCHAR WBuf2[]=L”Заткнигузно”;

 

Идентификатор TCHAR использовать удобнее в том случае, когда проект может компилироваться с использованием кодировки Unicode или без нее; в этом случае он означает одно- или двубайтный символ в зависимости от настроек проекта.

Использование макроса _T или символа L равнозначно (вместо _T иногда используют TEXT, что равнозначно). Символы Unicode можно вводить с клавиатуры или выводить на монитор с помощью объектов стандартной библиотеки wcin и wcout соответственно, например:

wcin>>WBuf;

wcout<<WBuf2<<endl;

 

При этом, однако, будут те же проблемы с символами кириллицы, что и при использовании ANSI-символов. Преобразование символов Unicode в кодировку ANSI (однобайтные символы) можно выполнить с помощью функции CharToOemW, например так:

char Buf[1024];

wchar_t WBuf2[1024]=L"Авиация";

CharToOemW(WBuf,Buf);

cout<<Buf<<endl; // выводит слово Авиация

 

Если в консольном приложении для обработки символов используется класс CString, то вывести значение строки на экран можно так:

char Buf[1024];

CString temp("Дятел клавиатуры");

CharToOemW(temp.GetBuffer(),Buf);

cout<<Buf<<endl;

 

Для преобразования символов Unicode в любую кодировку, в частности, и в 866 (кириллица MS DOS), можно использовать и функцию WideCharToMultiByte:

char Buf[1024];

WideCharToMultiByte(866,WC_NO_BEST_FIT_CHARS,      L"Студент",-1,Buf,sizeof(Buf),0,0);

cout<<Buf<<endl;

CString temp("Еще один дятел клавиатуры");

WideCharToMultiByte(866,WC_NO_BEST_FIT_CHARS,      temp.GetBuffer(),

                                    -1,Buf,sizeof(Buf),0,0);

cout<<Buf<<endl;

 

Для преобразования в кодировку Windows в качестве первого параметра необходимо указать 1251.

Для обратного преобразования служит функция MultiByteToWideChar. Параметры обеих функций рассматриваются в подразделе «Перекодировка строк из Unicode в ANSI и обратно» работы [8a]. В той же работе рекомендую почитать подраздел «Рекомендуемые приемы работы с символами и строками».

Для того чтобы определить кодировку текста в текстовом файле можно использовать функцию IsTextUnicode(), поддерживаемую библиотекой AdvApi32.dll и объявленную в WinBase.h [8a].

 

Еще одним способом преобразования символов Unicode (wchar_t) в char является функция

size_t wcstombs(char *mbstr, const wchar_t *wcstr, size_t count );

 

Однако ее существенным недостатком является тот факт, что символы кириллицы она не распознает и просто «выбрасывает» из результирующей строки, например:

       static char Buf[1024];

       CString str;

       str="// ABCDEFG вызов диалогового окна Cancel";

       wcstombs(Buf,str.GetBuffer(),sizeof(Buf));

  // Buf = = "// ABCDEFG"

 

«Безопасная» функция wcstombs_s ведет себя еще хуже.

 

Русифицировать (консольное) приложение можно и путем вызова функции setlocale(LC_ALL,"rus"), которая, упрощенно говоря, устанавливает русский язык в качестве языка ввода/вывода. Эту функцию достаточно вызвать один раз при запуске программы на выполнение – проще всего в начале функции _tmain().

 

Русификация оконных приложений.

В оконных приложениях, так же как и консольных, предпочтительнее использование кодировки Unicode везде, где это возможно. Символы кириллицы, как правило, корректно отображаются в управляющих элементах. При создании каркаса приложения надо в свойствах проекта выбирать «Русский» в списке Resource language.

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 736.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...