Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Visual C++ - расширенное программирование Недокументированные функции (часть 1)


Информационный Канал Subscribe.Ru

Visual C++ - расширенное программирование

Выпуск      : 15
Подписчиков : 5328
Cайт        : SoftMaker.com.ru
Архив       : Visual C++ - расширенное программирование (архив)
В этом выпуске
От автора

Здравствуйте уважаемые подписчики !

Как всегда, рад приветствовть вас на страницах этой рассылки.
Напоминаю, что, как обычно, вы можете отправить свои пожелания (замечания, предложения, сообщения об ошибках) по поводу рассылки и сайта по этому адресу.
Если вы хотите создать и вести какой либо раздел в этой рассылке - также пишите мне.

И, как всегда, вы можете задать свои вопросы по программированию на сайте в форуме.
Или обсудить их в дискуссионном листе "Программирование. форум !!!".

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

С уважением, Вахтуров Виктор.

P.S. Поздравляю всю прекрасную половину аудитории рассылки праздником 8 Марта ! Желаю всем счастья и творческих успехов.
Exceptional MFC

Недокументированные функции (часть 1)

Вместо вступления

Сегодня я продолжаю тему недокументированных функций, классов, макросов, структур данных, входящий в библиотеку MFC. В предыдущем выпуске я описывал функции различного назначения, которые были условно объединены в несколько групп (работа с окнами (интерфейс), работа с именами файлов и каталогов, функции, полезные для отладки). Сегодня речь пойдет о функциях одной "группы" - функциях обработки строк (конвертирование, форматирование, и.т.д.).

Функции работы со строками

Начать, пожалуй, стоит с очень простой, но достаточно полезной функции.

Функция AfxGetEmptyString
Декларирована AFXIMPL.H
Реализована WINCORE.CPP

Прототип:

const CString& AFXAPI AfxGetEmptyString();

Комментарии

Данными возвращаемого объекта является массив 4-х элементов типа int _afxInitData (код инициализации находится в файле STRCORE.CPP).

Функция оказывается полезна, когда необходимо возвратить из функции "пустой" объект класса CString (этот подход, достаточно широко используется в коде MFC) или передать ссылку на такой объект в функцию, или получить константный указатель на null-terminated строку нулевой длины (у которой первый элемент - 0).

В AFX.H определяется макрос:

#define afxEmptyString AfxGetEmptyString()

Именно afxEmptyString обычно и используется в коде MFC.


Функция AfxFormatStrings
Декларирована AFXWIN.H
Реализована APPHELP.CPP

Прототип:

void AFXAPI AfxFormatStrings(CString& rString, UINT nIDS,
    LPCTSTR const* rglpsz, int nString)

void AFXAPI AfxFormatStrings(CString& rString,
    LPCTSTR lpszFormat, LPCTSTR const* rglpsz, int nString)

Комментарии

Функция производит форматирование строки по шаблону, используя массив строк в качестве значений для подстановки в шаблон.

Эта функция принимает первым параметром ссылку на строку, которая будет содержать результат, вторым - идентификатор строкового ресурса, либо указатель на строку - шаблон, третьим - массив указателей на строки, содержимое которых будет подставлено вместо соответствующих маркеров %1, %2, %3...%Y, %Z строки шаблона.

Макеры в строке шаблона должны состоять из одного символа % и одного символа-цифры, либо одного символа-буквы (заглавной латинской). Тогда строка с индексом 0 в массиве строк будет подставлена на место всех %1, стока с индексом 1 - на место всех %2, строка с индексом 9 - на место всех %A, и.т.д.

На использовании данной функции основаны такие функции как: AfxFormatString1 и AfxFormatString2 (ныне документированные).

Данная функция (а также AfxFormatString1 и AfxFormatString2) подробно описаны в
третьем номере этой рассылки.


Функция _mbstowcsz
Декларирована AFX.H
Реализована STRCORE.CPP

Прототип:

int AFX_CDECL _mbstowcsz(wchar_t* wcstr, const char* mbstr,
                         size_t count);

Комментарии

Конвертирует multibyte строку mbstr в wide-character (Unicode) строку wcstr. Для конвертации используется кодовая страница ANSI.

count - размер буфера wcstr (в символах).

Возвращаемое значение - количество байт, записанных в wcstr.

Фактически _mbstowcsz является оберткой вокруг API функции MultiByteToWideChar. Перед вызовом MultiByteToWideChar осуществляется проверка на корректность и длину буфера wcstr (если wcstr == NULL или count == 0, то возвращается 0, а вызов MultiByteToWideChar не производится).

После вызова, если конвертация успешна, строка wcstr дополняется завершающим нулем.


Функция _wcstombsz
Декларирована AFX.H
Реализована STRCORE.CPP

Прототип:

int AFX_CDECL _wcstombsz(char* mbstr, const wchar_t* wcstr,
                         size_t count);

Комментарии

Конвертирует wide-character (Unicode) строку wcstr в multibyte строку mbstr. Для конвертации используется кодовая страница ANSI.

count - размер буфера mbstr (в байтах).

Возвращаемое значение - количество байт, записанных в mbstr.

Фактически _wcstombsz является оберткой вокруг API функции WideCharToMultiByte. Перед вызовом WideCharToMultiByte осуществляется проверка на корректность и длину буфера mbstr (если mbstr == NULL или count == 0, то возвращается 0, а вызов WideCharToMultiByte не производится).

После вызова, если конвертация успешна, строка mbstr дополняется завершающим нулем.


Функция AfxA2WHelper
Декларирована AFXCONV.H
Реализована STRCORE.CPP

Прототип:

LPWSTR AFXAPI AfxA2WHelper(LPWSTR lpw, LPCSTR lpa, int nChars);

Комментарии

Конвертирует multibyte строку lpa в wide-character (Unicode) строку lpw. Для конвертации используется кодовая страница ANSI.

nChars - размер буфера wcstr (в символах).

Возвращаемое значение - значение lpw.

Аналогично _mbstowcsz, является оберткой вокруг API функции MultiByteToWideChar. Но не осуществляется проверок длины буфера lpa. Если lpa == NULL, возвращается NULL (вызов MultiByteToWideChar не производится).


Функция AfxW2AHelper
Декларирована AFXCONV.H
Реализована STRCORE.CPP

Прототип:

LPSTR AFXAPI AfxW2AHelper(LPSTR lpa, LPCWSTR lpw, int nChars);

Комментарии

Конвертирует wide-character (Unicode) строку lpw в multibyte строку lpa. Для конвертации используется кодовая страница ANSI.

nChars - размер буфера mbstr (в байтах).

Возвращаемое значение - значение lpa.

Аналогично _wcstombsz, является оберткой вокруг API функции WideCharToMultiByte. Но не осуществляется проверок длины буфера lpw. Если lpw == NULL, возвращается NULL (вызов WideCharToMultiByte не производится).


Функция AfxBSTR2CString
Декларирована AFXPRIV2.H
Реализована OLECNVRT.CPP

Прототип:

void AFXAPI AfxBSTR2CString(CString* pStr, BSTR bstr);

Комментарии

Переносит содержимое BSTR (binary string) - строки в содержимое объекта класса CString. Если не определены макросы _UNICODE или OLE2ANSI, то производится также конвертирование строки из UNICODE в ANSI посредством вызова WideCharToMultiByte.

Достаточно полезная, на мой взгляд, функция.


Функция AfxBSTR2ABSTR
Декларирована AFXPRIV2.H
Реализована OLECNVRT.CPP

Прототип:

BSTR AFXAPI AfxBSTR2ABSTR(BSTR bstrW);

Комментарии

Конвертирует UNICODE BSTR - строку в ANSI BSTR - строку. Возвращается указатель на новую строку (создается в функцией посредством вызова SysAllocStringByteLen).


Функция AfxTaskStringA2W
Декларирована AFXPRIV2.H
Реализована OLECNVRT.CPP

Прототип:

LPWSTR AFXAPI AfxTaskStringA2W(LPCSTR lpa);

Комментарии

Конвертирует ANSI строку lpa в UNICODE - строку, указатель на которую возвращяется функцией. Возвращаемый указатель указывает на новый блок памяти (возвращаемое значение не равно значению lpa). Это блок создается функцией CoTaskMemAlloc (и должен быть уничтожен при помощи CoTaskMemFree).

Блок памяти, указатель на который передается в качестве параметра lpa, также должен быть выделен при помощи CoTaskMemAlloc. Он уничтожается в функции вызовом CoTaskMemFree.

Для конвертации используется кодовая страница ANSI.

Данная функция использует AfxAllocTaskWideString (см. ниже).


Функция AfxTaskStringW2A
Декларирована AFXPRIV2.H
Реализована OLECNVRT.CPP

Прототип:

LPSTR AFXAPI AfxTaskStringW2A(LPCWSTR lpw);

Комментарии

Конвертирует UNICODE строку lpw в ANSI - строку, указатель на которую возвращяется функцией. Возвращаемый указатель указывает на новый блок памяти (возвращаемое значение не равно значению lpw). Это блок создается функцией CoTaskMemAlloc (и должен быть уничтожен при помощи CoTaskMemFree).

Блок памяти, указатель на который передается в качестве параметра lpw, также должен быть выделен при помощи CoTaskMemAlloc. Он уничтожается в функции вызовом CoTaskMemFree.

Для конвертации используется кодовая страница ANSI.

Данная функция использует AfxAllocTaskAnsiString (см. ниже).


Небольшое замечание

В файле AFXCONV.H определены 3 макроса: TASKSTRINGT2OLE, TASKSTRINGOLE2T и BSTR2TBSTR. Их определение зависит от того, определены ли макросы _UNICODE и OLE2ANSI:

#if defined(_UNICODE)
// in these cases the default (TCHAR) is the same as OLECHAR
  AFX_INLINE LPOLESTR TASKSTRINGT2OLE(LPOLESTR lp) { return lp; }
  AFX_INLINE LPTSTR TASKSTRINGOLE2T(LPOLESTR lp) { return lp; }
  AFX_INLINE BSTR BSTR2TBSTR(BSTR bstr) { return bstr;}
#elif defined(OLE2ANSI)
// in these cases the default (TCHAR) is the same as OLECHAR
  AFX_INLINE LPOLESTR TASKSTRINGT2OLE(LPOLESTR lp) { return lp; }
  AFX_INLINE LPTSTR TASKSTRINGOLE2T(LPOLESTR lp) { return lp; }
  AFX_INLINE BSTR BSTR2TBSTR(BSTR bstr) { return bstr; }
#else
  #define TASKSTRINGT2OLE(lpa)    AfxTaskStringA2W(lpa)
  #define TASKSTRINGOLE2T(lpo) AfxTaskStringW2A(lpo)
  #define BSTR2TBSTR(bstr) AfxBSTR2ABSTR(bstr)
#endif

Безусловно, полезные макросы при работе со строками, передаваемыми, или возвращенными различными методами COM-интерфейсов.


Функция AfxAllocTaskAnsiString
Декларирована AFXDISP.H
Реализована OLECNVRT.CPP

Прототип:

LPSTR AFXAPI AfxAllocTaskAnsiString(LPCSTR lpszString);
LPSTR AFXAPI AfxAllocTaskAnsiString(LPCWSTR lpszString);

Комментарии

Создает ANSI-строку с содержимым строки lpszString. Память выделяется при помощи CoTaskMemAlloc.

Как видно, есть 2 функции, одна из которых принимает ANSI-строку, другая - UNICODE-строку. Каждая из функций создает новую ANSI-строку, память под которую выделяется с помощью CoTaskMemAlloc, указатель на нее является возвращаемым значением функции.

В первом случае (функция, принимающая в качестве параметра lpszString ANSI-строку) производится копирование содержимого строки lpszString в созданный блок памяти.

Во втором случае (функция, принимающая в качестве параметра lpszString UNICODE-строку) производится конвертирование строки lpszString в ANSI-строку (результат заносится в созданный блок памяти). Для конвертации используется кодовая страница ANSI.

Блок памяти, содержащий исходную строку (на который указывает lpszString) - может быть любым - его содержимое сохраняется после вызова функции.


Функция AfxAllocTaskWideString
Декларирована AFXDISP.H
Реализована OLECNVRT.CPP

Прототип:

LPWSTR AFXAPI AfxAllocTaskWideString(LPCSTR lpszString);
LPWSTR AFXAPI AfxAllocTaskWideString(LPCWSTR lpszString);

Комментарии

Создает UNICODE-строку с содержимым строки lpszString. Память выделяется при помощи CoTaskMemAlloc.

Как видно, есть 2 функции, одна из которых принимает ANSI-строку, другая - UNICODE-строку. Каждая из функций создает новую UNICODE-строку, память под которую выделяется с помощью CoTaskMemAlloc, указатель на нее является возвращаемым значением функции.

В первом случае (функция, принимающая в качестве параметра lpszString ANSI-строку) производится конвертирование строки lpszString в UNICODE-строку (результат заносится в созданный блок памяти). Для конвертации используется кодовая страница ANSI.

Во втором случае (функция, принимающая в качестве параметра lpszString UNICODE-строку) производится копирование содержимого строки lpszString в созданный блок памяти.

Блок памяти, содержащий исходную строку (на который указывает lpszString) - может быть любым - его содержимое после вызова функции.


Небольшое замечание

В файле AFXDISP.H определены макросы: AfxAllocTaskString и AfxAllocTaskOleString. Их определение зависит от того, определены ли макросы _UNICODE и OLE2ANSI:

#ifdef _UNICODE
   #define AfxAllocTaskString(x) AfxAllocTaskWideString(x)
#else
   #define AfxAllocTaskString(x) AfxAllocTaskAnsiString(x)
#endif

#ifdef OLE2ANSI
   #define AfxAllocTaskOleString(x) AfxAllocTaskAnsiString(x)
#else
   #define AfxAllocTaskOleString(x) AfxAllocTaskWideString(x)
#endif

Очевидно, их использование уместно при наличии ANSI и UNICODE версий конфигурации проекта.


Функция AfxGetClassIDFromString
Декларирована AFXDISP.H
Реализована OLEDISP2.CPP

Прототип:

HRESULT AFXAPI AfxGetClassIDFromString(LPCTSTR lpsz,
                                       LPCLSID lpClsID);

Комментарии

Конвертирует строку lpsz в CLSID.

Эта функция является оберткой вокруг функций CLSIDFromString и CLSIDFromProgID. Функция вызывает CLSIDFromString, если строка lpsz (первый параметр) начинается с символа "{" (то есть должна представлять собой строку, сгенерированную StringFromCLSID), или CLSIDFromProgID, если это не так (строка lpsz начинается не с символа "{").

Возвращаемое значение функции является возвращаемым значением CLSIDFromString или CLSIDFromProgID.


Функция AfxGetIIDString
Декларирована AFXOLE.H
Реализована OLEUNK.CPP

Прототип:

LPCTSTR AFXAPI AfxGetIIDString(REFIID iid);

Комментарии

Конвертирует переданный IID в удобочитаемую строку.

Если ссылка на переданный IID находится в определенном в функции массиве структур из 76 элементов (см. код функции), устанавливающем соответствие между некоторыми IID и строковыми константами, содержащими символьное представление этих IID, то возвращается указатель на строку, представляющую такую константу. Иначе, возвращается указатель строку, содержащую символьное представление GUID, переданного IID вида: XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXXXXXX.

Функция определена только в DEBUG-версии библиотеки.


Функция AfxStringFromCLSID
Декларирована AFXIMPL.H
Реализована FILECORE.CPP

Прототип:

CString AFXAPI AfxStringFromCLSID(REFCLSID rclsid);

Комментарии

Конвертирует CLSID в символьную строку.

Фактически она аналогична OLE API функции StringFromCLSID, однако, для ее использования нет необходимости загружать библиотеки OLE, а также возвращаемым значением является объект класса CString (после вызова StringFromCLSID выходной буффер необходимо удалять с помощью CoTaskMemFree, в случае же AfxStringFromCLSID об удалении буфера заботиться не надо).


Автор материалов выпуска : Вахтуров Виктор.

Книги по C++, Visual C++, MFC
Самоучитель Жаркова по анимации и мультипликации в Visual С++ .NET 2003
Самоучитель Жаркова по анимации и мультипликации в Visual С++ .NET 2003

Автор: В. А. Жарков

Книга издана впервые в мире как суперсамоучитель по разработке анимации и мультипликации в очень известном и перспективном комплексе новейшей версии Visual C++ .NET 2003 платформы Microsoft Visual Studio .NET 2003.

Даны концепции программирования и методология разработки анимации и мультипликации на принципиально новом управляемом языке C++ (который существенно упрощает и в несколько раз сокращает время написания и отладки C++ программ) при создании таких важных приложений VC++ .NET 2003:

  • Персональный калькулятор и корпоративная вычислительная система.
  • Система компьютерной математики.
  • Построение графиков функций.
  • Базы данных и системы управления ими.
  • Взаимодействие Visual C++ .NET 2003 с Excel, Word, Access и другими платформами.
  • Аналитическое и численное математическое моделирование процессов.
  • Решение задач и расчеты методом конечных элементов (МКЭ).
  • Определение оптимального раскроя различных материалов.
  • Расчеты площади поверхности, объема и массы изделий (деталей, вещей).
  • Системы компьютерного проектирования процессов (CAD/CAM system).
  • Механика деформирования тела.
Анимация разработана в проектах:

  • вывод времени и даты,
  • изменение панелей и элементов управления,
  • вращение линий,
  • управляемое вращение и перемещение фигур,
  • градиентное заполнение фигур различным цветом,
  • бегущие строки,
  • мигающие тексты,
  • летающие объекты типа мяча, шара, пули
  • и многие другие проекты.
Мультипликация изображений создана в виде изменения во времени формы и цвета разнообразных рисунков, чертежей и процессов.

Приведена методика передачи пользователю разработанных приложений. Большое количество написанных автором программ из этой книги может быть вставлено в различные приложения VC++ .NET 2003 и VC++ .NET 2002 и прекрасно работать.

Книга предназначена для всех желающих быстро изучить очень перспективный (в мире программирования) управляемый язык C++, сразу же создавать в Visual C++ .NET 2003 и Visual C++ .NET 2002 анимации и мультипликации в виде профессиональных приложений и применять их на практике. Также адресована начинающим и опытным профессиональным пользователям, программистам различной квалификации, инженерно-техническим работникам, конструкторам, технологам, математикам и механикам, а также учащимся и слушателям курсов и школ, студентам, аспирантам, преподавателям и научным работникам.

Страница книги на Озоне
Объектно-ориентированное программирование в C++ | (Object-Oriented Programming in C++)
Объектно-ориентированное программирование в C++ | (Object-Oriented Programming in C++)

Автор: Р. Лафоре

Благодаря этой книге тысячи пользователей овладели технологией объектно-ориентированного программирования в C++.

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

Читатель может вообще не иметь представления о C++. Необходимо лишь знание начальных основ программирования.

Страница книги на Озоне
Рассылки и дискуссионные листы компьютерной тематики
Рассылки
C/C++ Вопрос-Ответ

Это - интерактивная рассылка !
Здесь Вы можете задать свой вопрос по программированию на C и C++, а также ответить на вопросы других подписчиков.


Программирование на JavaScript

Все аспекты программирования на JavaScript - нестандартные приемы, ОРИГИНАЛЬНЫЕ скрипты, авторские статьи и наработки. "JavaScript solutions" - в каждом выпуске готовый к применению ИНТЕРЕСНЫЙ скрипт (исходный код с комментариями).

Дискуссионные листы
Программирование. Форум !!!

Самый популярный дискуссионный лист по программированию на subscribe.ru, существующий с момента открытия сервиса дискуссионных листов !

Задайте здесь любой вопрос по программированию - и Вы получите ответ. Участвуйте в оживленных дискуссиях, обсуждайте интересные темы. Давайте ответы сами. Ведь это форум !!! Здесь просто интересно ! Присоединяйтесь !

Вебстроительство. Форум !!!

В дискуссионном листе ведется обсуждение различных аспектов создания сайтов - написание скриптов, использование, настройка портальных движков, и многое другое. Присоединяйтесь !

Поисковые системы. Форум !!!

Этот дискуссионный лист посвящен обсуждению поиковых систем, методов индексации сайтов поисковиками, способам оптимизации сайта под поисковые системы.

Хостинг. Обзоры и обсуждения платного и бесплатного хостинга.

Вы ищете хостинг (платный, бесплатный) ? Хотите спросить совета в выборе ? Можете обсудить это здесь. Поделитесь советом, если знаете. Или узнайте больше. Все о хостинге.


Всего доброго. До встречи в следующем номере.

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.qandacpp
Отписаться

В избранное