По своему опыту программирования у меня накопилось множество небольших функций и классов которые 'кочуют' из проекта в проект — это такие общие ф-ции и классы, к которым я так привык, что считаю что они всегда есть. Поэтому большинство моих выложенных здесь исходников программ и используют данный модуль.
Практически все функции — это просто обёртки над их одноименными Win32 API аналогами. Ну, а функциональность других функций и классов вроде должна быть понятна из их названий. Но я всё-таки приведу описание к некоторым.
Исходники библиотеки — это 3 файла. Заголовок CommonLib.h где описаны все ф-ции и классы, заголовок CommonLib.hpp содержащий реализацию inline функций, ну и реализация всего остального — в файле CommonLib.cpp. Выкачать всё в виде архива можно здесь.
Размещение окна. Координата. Точка пикселя. Размер.
Всё это описывается с помощью стандартных структур RECT/COORD/POINT/SIZE. А так как лень каждый раз, например, перемещая прямоугольник окна, изменять значения аж 4! :) членов структуры, или, например, приводить точку к координате (2 операции!), то мной и был придуман этот велосипед для чистого API - классы RECTEX/COORDEX/POINTEX/SIZEEX. Я пронаследовался от каждой из структур, добавил свои методы. И так привык к этим расширениям, что теперь, даже когда пишу в MFC/WTL, вовсю ими пользуюсь вместо стандартных CRect/CPoint/CSize, благо они пронаследованы от одних структур.
Все ф-ции - это врапперы над одноимёнными API ф-циями, в которых OUT параметр теперь является просто результатом.
Пример такой функции - GetWindowText. Для меня остаётся загадкой, почему ни в MFC, ни в WTL нет реализации GetWindowText, которая бы сразу возвращала строку. Ведь гораздо проше писать
CString str = "Window text is [" + ::GetWindowText(hWnd) + "]";
одной строкой, чем тоже самое на MFC
CString strCaption;
this->GetWindowText(strCaption);
CString str = "Window text is [" + strCaption + "]";
в 3 строки. В WTL аналогично MFC...
Многие мои оконные ф-ции оперируют моими же классами RECTEX и POINTEX. Это такие ф-ции, как преобразование оконных/экранных координат, ф-ции позиционирования окна.
Функции для выбора файла при его открытии/сохранении, выбор директории; определения размера файла; наличие файла/папки; выборка из полного пути только файла или директории; взятие текущего каталога, каталога Windows, системной директории, временного каталога. Есть также функции перечислния файлов по маске и папок.
Это функции для определения размера иконки и битмапы, создание битмапы и маски. Есть также ф-ции переноса контекста изображения, расширяющие стандартные BitBlt/StretchBlt, с целью уменьшения количества входных параметров. Так же есть функции переноса изображения по маске - это мой аналог функции TransparentBlt, только маска задаётся как самой маской, так и прозрачным цветом и множеством точек.
Это полность статический класс. Имея только одну строку вида 'ключ(ветка) \ имя значения' можно сделать как выборку из реестра, так и установку значения. Мне приходилось пока работать только со строковыми значениями, с целым типом и с бинарными данными. Поэтому там и есть только эти методы.
Также есть методы для удаления ключа или конкретного значения. Для создания ветки и/или ключа со зачением нужно пользоваться методами устанавливающими значение.
Предусмотрены методы перечисления как ключей, так и значений в заданной ветке. Есть два типа перечисляющих методов - обычное перечисление по индексу (для цикла) или задающей перечисление с пользовательской callback функцией.
На счёт прав доступа - я непредусматривал. Беруться текущие права, по-умолчанию.
Все эти методы дублируются одноимёнными методами, в которых параметр ключа задаётся традиционным дескриптором, а не строкой. Так что если нужно работать с прочими правами доступа, создавайте нужный хэндл сами, и вперёд!
BOOL EncryptDES(IN constBYTE* pKey, IN DWORD dwSizeKey, IN constBYTE* pData, IN DWORD dwSizeData, IN DWORD dwCryptModeDES, OUT BYTE* pCryptData, IN OUT DWORD &dwSizeCryptData);
BOOL DecryptDES(IN constBYTE* pKey, IN DWORD dwSizeKey, IN constBYTE* pCryptData, IN DWORD dwSizeCryptData, IN DWORD dwCryptModeDES, OUT BYTE* pDecryptData, IN OUT DWORD &dwSizeDecryptData);
BOOL Encrypt3DES(IN constBYTE* pKey, IN DWORD dwSizeKey, IN constBYTE* pData, IN DWORD dwSizeData, IN DWORD dwCryptModeDES, OUT BYTE* pCryptData, IN OUT DWORD &dwSizeCryptData);
BOOL Decrypt3DES(IN constBYTE* pKey, IN DWORD dwSizeKey, IN constBYTE* pCryptData, IN DWORD dwSizeCryptData, IN DWORD dwCryptModeDES, OUT BYTE* pDecryptData, IN OUT DWORD &dwSizeDecryptData);
struct POINTEX: public POINT {
POINTEX() {x= y=0 ;}
POINTEX(const POINT &p) {x=p. x; y=p. y;}
POINTEX(const SIZE &p) {x=p.cx; y=p.cy;}
POINTEX(LONG nx, LONG ny) {x= nx; y= ny;}
POINTEX& operator+= (const POINT &a) {x+=a.x; y+=a.y; return *this;}
POINTEX& operator-= (const POINT &a) {x-=a.x; y-=a.y; return *this;}
POINTEX& operator*= (LONG val ) {x*=val; y*=val; return *this;}
POINTEX& operator/= (LONG val ) {x/=val; y/=val; return *this;}
operator SIZE() const {SIZE result = {x,y}; return result;}
//operator RECT() const {RECT rect = {0,0,x,y}; return rect;}
};
inline POINT operator* (LONG val , const POINT &a) {return POINTEX(a.x*val, a.y*val);}
inline POINT operator* (const POINT &a, LONG val ) {return POINTEX(a.x*val, a.y*val);}
inline POINT operator/ (const POINT &a, LONG val ) {return POINTEX(a.x/val, a.y/val);}
inline POINT operator+ (const POINT &a, const POINT &b) {return POINTEX(a.x+b.x, a.y+b.y);}
inline POINT operator- (const POINT &a, const POINT &b) {return POINTEX(a.x-b.x, a.y-b.y);}
inlinebool operator== (const POINT &a, const POINT &b) {return (a.x==b.x && a.y==b.y);}
inlinebool operator!= (const POINT &a, const POINT &b) {return (a.x!=b.x || a.y!=b.y);}
struct SIZEEX: public SIZE {
SIZEEX() {cx= cy=0 ;}
SIZEEX(const SIZE &p) {cx=p.cx; cy=p.cy;}
SIZEEX(const POINT &p) {cx=p. x; cy=p. y;}
SIZEEX(const RECT &p) {cx=p.right - p.left; cy=p.bottom-p.top;}
int nFolder = /** /CSIDL_DRIVES/**/-1/**/); // если -1 - то вызов стандартного диалога выбора папки
// иначе спецпапка - see CSIDL_... (func SHGetSpecialFolderLocation)
ULONGLONG GetFileSizeEx(LPCTSTR szFileName); // размер файла
DWORD GetFileSize (LPCTSTR szFileName); // размер файла
inlineULONGLONG GetFileSizeEx(HANDLE hFile); // размер файла
BOOL ParseFileName(IN LPCTSTR szFullFileName, OUT CString &strDrive, OUT CString &strDir, OUT CString &strFileName, OUT CString &strExtension);
CString GetFileDir (LPCTSTR szFullFileName); // возвращает только путь к файлу без имени файла (путь с наклонной чертой в конце)
CString GetFileName (LPCTSTR szFullFileName); // возвращает только имя файла без пути
CString GetFileVersion(LPCTSTR szFileName, OUT WORD *pwVerMSHigh=NULL, OUT WORD *pwVerMSLow=NULL, OUT WORD *pwVerLSHigh=NULL, OUT WORD *pwVerLSLow=NULL);
inlineBOOL PathExist(LPCTSTR szPath);
inlineBOOL FileExist(LPCTSTR szPath);
inline CString GetModuleFileName(HMODULE hModule = NULL); // retrieves the full path and filename for the executable file containing the specified module
inline CString GetModuleDir (HMODULE hModule); // возвращает путь к модулю без имени модуля (с наклонной чертой в конце)
CString GetWindowText(HWND hWnd, int iMaxLen = -1);
BOOL StringAsBytes (IN const CString &str, OUT BYTE *pBuffer, IN OUT DWORD &dwSize); // обратная ф-ции MemCopyAsHex - представить строку, например "F15900F7", как строку последовательность байт {0xF1, 0x59, 0x00, 0xF7}
HRESULT MemBufferToSafeArray(IN constBYTE *pData, IN DWORD dwSize, OUT SAFEARRAY *&sarrData); // через SafeArrayCreate...
HRESULT SafeArrayToMemBuffer(IN SAFEARRAY *pSarrData, OUT BYTE *&pData, IN OUT DWORD &dwSize);
staticDWORD GetDWord (IN LPCTSTR szKeyName); // Return value. Example - "HKEY_CURRENT_USER\\SOFTWARE\\dwParam"
staticDWORD GetBinary(IN LPCTSTR szKeyName, OUT BYTE *pbValue, IN OUT DWORD &dwSizeValue); // Return error code!!!. Example - "HKEY_CURRENT_USER\\SOFTWARE\\bnParam", you byte array for result, size byte array.
// write methods
staticDWORD SetString(IN LPCTSTR szKeyName, IN LPCTSTR szValue); // Return error code. Example - "HKEY_CURRENT_USER\\SOFTWARE\\strParam", "value"
staticDWORD SetDWord (IN LPCTSTR szKeyName, IN DWORD dwValue); // Return error code. Example - "HKEY_CURRENT_USER\\SOFTWARE\\dwParam", 123
staticDWORD SetBinary(IN LPCTSTR szKeyName, IN constBYTE *pbValue, IN DWORD cbValue); // Return error code. Example - "HKEY_CURRENT_USER\\SOFTWARE\\bnParam", you byte array, size byte array.
// delete methods
staticBOOL DeleteKey (IN HKEY hKey, IN LPCTSTR szSubKey);
staticBOOL DeleteKey (IN LPCTSTR szKey, IN LPCTSTR szSubKey);
staticBOOL DeleteValue(IN HKEY hKey, IN LPCTSTR szValueName);
staticBOOL DeleteValue(IN LPCTSTR szKeyName);
// is exist
staticBOOL ExistKey (IN HKEY hKey);
staticBOOL ExistKey (IN LPCTSTR szKey); // Example - "HKEY_CURRENT_USER\\SOFTWARE\\MyProg\\"
staticBOOL ExistValue(IN HKEY hKey, IN LPCTSTR szValueName, OUT LPDWORD pdwRegType = NULL);
staticBOOL ExistValue(IN LPCTSTR szKeyName, OUT LPDWORD pdwRegType = NULL); // Example - "HKEY_CURRENT_USER\\SOFTWARE\\MyProg\\param"
staticBOOL CRegistry::GetKeyPath(IN HKEY hKey, OUT CString &strKeyPath);
// find methods
typedefBOOL (CALLBACK* SUBKEYENUMPROC )(IN HKEY hKey, IN LPCTSTR szKey, IN DWORD dwIndex, IN LPCTSTR szSubKey, IN LPVOID lpUserData); // if return FALSE -> stop enumerators
typedefBOOL (CALLBACK* VALUENAMEENUMPROC)(IN HKEY hKey, IN LPCTSTR szKey, IN DWORD dwIndex, IN LPCTSTR szValueName, IN DWORD dwType, IN LPVOID lpUserData); // if return FALSE -> stop enumerators
staticBOOL EnumSubKeyName(IN HKEY hKey, IN SUBKEYENUMPROC lpEnumFunc, IN LPVOID lpUserData);
staticBOOL EnumSubKeyName(IN LPCTSTR szKey, IN SUBKEYENUMPROC lpEnumFunc, IN LPVOID lpUserData);
static CString EnumSubKeyName(IN HKEY hKey, IN DWORD dwIndex);
static CString EnumSubKeyName(IN LPCTSTR szKey, IN DWORD dwIndex); // example - "HKEY_CURRENT_USER\\SOFTWARE", 1 or "HKEY_CURRENT_USER\\SOFTWARE\\", 1
staticBOOL EnumValueName (IN HKEY hKey, IN VALUENAMEENUMPROC lpEnumFunc, IN LPVOID lpUserData);
staticBOOL EnumValueName (IN LPCTSTR szKey, IN VALUENAMEENUMPROC lpEnumFunc, IN LPVOID lpUserData);
static CString EnumValueName (IN HKEY hKey, IN DWORD dwIndex, OUT DWORD &dwType);
static CString EnumValueName (IN LPCTSTR szKey, IN DWORD dwIndex, OUT DWORD &dwType); // example - "HKEY_CURRENT_USER\\SOFTWARE", 1 or "HKEY_CURRENT_USER\\SOFTWARE\\", 1
CString WinInetErrCode2Str(IN DWORD dwErrCode, DWORD dwLanguageId = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT) ); // from WinInet.dll \__ Почти одно и тоже...
inlineHMODULE GetLibrary(IN LPCTSTR szDLL, IN BOOL bAsDataFile, OUT BOOL &bLoadLibrary); // найти загруженную библиотеку, а если нет - самому загрузить