Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Статьи - WinAPI и реестр 
:(
    Опции темы
Fixin
  Дата 11.1.2005, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Расскажите о ких-нить статьях в инете или еще где-то (в смысле выложить здесь или на мыло).
Толковые. Те, что я видел, показались мне не очень надежными smile . Боюсь наковырять лишнего. smile
Добавлено @ 23:13
Сам тоже есесно поищу smile
PM MAIL ICQ   Вверх
chipset
Дата 12.1.2005, 05:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 2
Всего: 165



Fixin
http://msdn.com
http://firststeps.ru
Книга: Д. М. Харт, Системное программирование в среде win32, 2-е издание.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Alexandr87
Дата 12.1.2005, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: нет
Всего: 39



Реестр ,пожалуй, одна из самых замечательных особенностей Windows-действительно насколько удобно ,что все настройки системы, а также программ,установленных на компьютере, находятся в одном месте.
На самом деле, работать с реестром очень просто, единственной проблемой, которая может возникнуть, является незнание тонкостей API. Я постараюсь в этой статье рассмотреть некоторые из них, за остальным как обычно посылаю к MSDN.
Что нужно уметь делать с реестром? Очевидно, создавать ключи в нем и присваивать им значения.Ключ создается с помощью функции RegCreateKeyEx:

LONG RegCreateKeyEx(
HKEY hKey, // хэндл открытого ключа
LPCTSTR lpSubKey, // имя "под_ключа"
DWORD Reserved, // всегда 0
LPTSTR lpClass, // имя класса
DWORD dwOptions, // специальные опции
REGSAM samDesired, // уровень защиты\доступа
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // параметр важный если хэндл
// ключа будет унаследован
// дочерним процессом

PHKEY phkResult, // в это поле вернется хэндл // созданного ключа

LPDWORD lpdwDisposition // этот параметр показывает
// был ли ключ создан, или
// он уже присутствовал и
// был просто открыт без
// изменения его значения
// (обязательно переменная)
);

* HKEY hkey-хэндл открытого уже ключа или одно из заранее определенных значений:
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
Windows NT/2000 or later: HKEY_PERFORMANCE_DATA
Windows 95/98/Me: HKEY_DYN_DATA

* LPCTSTR lpSubKey-собственно имя ключа,который мы хотим создать (должно заканчиваться символом нуль)
* LPTSTR lpClass-для уже существующего ключа игнорируется,вобще почти всегда можно давать этому параметру значение NULL
* DWORD dwOptions-формально,оперделяет,когда ключ начнет действовать, приведу выдранный из MSDN кусок,разобраться в нем не сложно:

REG_OPTION_NON_VOLATILE This key is not volatile; this is the default.
The information is stored in a file and is
preserved when the system is restarted.
The RegSaveKey function saves keys that are
not volatile.

REG_OPTION_VOLATILE Windows NT/2000 or later: All keys created
by the function are volatile. The information
is stored in memory and is not preserved when
the corresponding registry hive is unloaded.
For HKEY_LOCAL_MACHINE, this occurs when the
system is shut down. For registry keys loaded
by the RegLoadKey function, this occurs when
the corresponding RegUnloadKey is performed.
The RegSaveKey function does not save volatile
keys. This flag is ignored for keys that
already exist.
Windows 95/98/Me: This value is ignored.
If REG_OPTION_VOLATILE is specified,
the RegCreateKeyEx function creates
nonvolatile keys and returns ERROR_SUCCESS.

REG_OPTION_BACKUP_RESTORE Windows NT/2000 or later: If this flag is set,
the function ignores the samDesired parameter
and attempts to open the key with the access
required to backup or restore the key.
If the calling thread has the SE_BACKUP_NAME
privilege enabled, the key is opened with
ACCESS_SYSTEM_SECURITY and KEY_READ access.
If the calling thread has the SE_RESTORE_NAME
privilege enabled, the key is opened with
ACCESS_SYSTEM_SECURITY and KEY_WRITE access.
If both privileges are enabled, the key has
the combined accesses for both privileges.

т.к ,к сожалению, на данный момент у меня стоит win98,то этот параметр в ней практически игнорируется.

* REGSAM samDesired-уровень доступа к ключу, подробно описание можно посмотреть во все том же MSDN, скажу только, что для полного доступа значением должно быть KEY_ALL_ACCESS|KEY_READ|KEY_WRITE
* LPSECURITY_ATTRIBUTES lpSecurityAttributes-рассмотрение описания данной структуры в тему данной статьи не входит, это скорее относится к многопоточному программированию,кому же очень интересно-идите к ... ну вы понялиsmile
В дальнейшем смысл одноименных параметров сохраняется ,поэтому я буду оговаривать только новые значения и кое-что об их формате.

Поскольку зачастую просто лень указывать все значения параметров,я использую иногда функцию RegCreateKey(16-bit):

LONG RegCreateKey(
HKEY hKey,
LPCTSTR lpSubKey,
PHKEY phkResult
);

Ключ мы создали,надо ему присвоить значение.Делается это с помощью функции RegSetValueEx:

LONG RegSetValueEx(
HKEY hKey, // уже открытый ключ
LPCTSTR lpValueName, // имя значения(поля) ключа,которому приваиваем что-то
DWORD Reserved, // всегда 0
DWORD dwType, // тип значения
CONST BYTE *lpData, // буфер с данными (ДОЛЖЕН ЗАВЕРШАТЬСЯ ДВУМЯ НУЛЯМИ!!!)
DWORD cbData // размер данных в байтах
);

* DWORD dwType-тип значения может принимать константы REG_SZ (для дефолтового поля), REG_EXPAND_SZ(для строки символов),REG_MULTI_SZ (для типа DWORD).
Закрывается хэндл ключа с помощью функции LONG RegCloseKey(HKEY hkey),hkey-хэндл ключа, который надо закрыть.

Открать ключ снова можно функцией RegOpenKeyEx:
LONG RegOpenKeyEx(
HKEY hKey,
LPCTSTR lpSubKey,
DWORD ulOptions, // 0
REGSAM samDesired,
PHKEY phkResult
);

Смысл и возможные значения параметров аналогичны функции RegCreateKeyEx.

Получить значения полей ключа/инфу о субключах можно используя RegQueryValueEx:

LONG RegQueryValueEx(
HKEY hKey, // уже открытый ключ
LPCTSTR lpValueName, // имя значения(поля) ключа,из которого читаем
LPDWORD lpReserved, // всегда 0
LPDWORD lpType, // тип значения поля возвращается сюда
LPBYTE lpData, // буфер для данных
LPDWORD lpcbData // размер буфера в байтах
);

И наконец удаляется ключ функцией RegDeleteKey:

LONG RegDeleteKey(
HKEY hKey, // уже открытый ключ
LPCTSTR lpSubKey // имя ключа для удаления
);

Обратите внимание, если hkey указывает на HKLM\key\subkey, а lpSubKey="subkey\0",то неудаленным останется HKLM\key,правильный вариант, если надо удалить весь HKLM\key\subkey, то lpSubKey="key\0".
При работе с реестром все строки, если это отдельно не оговорено ,должны завершаться нулем.
Все упомянутые функции при удачном завершении возвращают ERROR_SUCCESS.

Ну вот ,наверное , все ,что я хотел рассказать о реестре.Чтобы все упомянутое стало немного более понятным приведу небольшой сорс(почти без коментариев),иллюстрирующий предмет статьи:прога открывает ключ ,записывает в него имя файла,из которого она запущена(GetModuleFileName),закрывает ключ,снова его открывает,проверяет его значение и удаляет.

#include <windows.h>
#include <stdio.h>
int main()
{
HKEY hkey;
const char path[]="c-duke\\test\0";
const char name[]="key\0";
long result=RegCreateKey(HKEY_LOCAL_MACHINE,(char *) &path,&hkey);
if (result!=ERROR_SUCCESS)
{
printf("Cannot open key\n");//здесь и далее так обрабатываются
return -1; //ошибки
}
char p[256];
unsigned long len=GetModuleFileName(NULL,p,256);
p[len]=0x00;
result=RegSetValueEx(hkey,(char *) &name,0,REG_EXPAND_SZ,
(byte *)p,lstrlen(p)+1);//p-double NULL terminated
if (result!=ERROR_SUCCESS)
{
printf("failed to write key value\n");
return -1;
}
result=RegCloseKey(hkey);
if (result!=ERROR_SUCCESS)
{
printf("failed to close key \n");
return -1;
}
result=RegOpenKeyEx(HKEY_LOCAL_MACHINE,path,0,
KEY_ALL_ACCESS|KEY_READ|KEY_WRITE,&hkey);
if (result!=ERROR_SUCCESS)
{
printf("failed to open key \n");
return -1;
}
len=lstrlen(p)+1;
result=RegQueryValueEx(hkey,name,NULL,NULL,(byte *)&p,&len);
if (result!=ERROR_SUCCESS)
{
printf("failed to query key value \n");
return -1;
}
printf("key value:%s\n",p);
result=RegDeleteKey(HKEY_LOCAL_MACHINE,"c-duke\0");
//надо указывать корневой ключ
if (result!=ERROR_SUCCESS)
{
printf("failed to delete key \n");
return -1;
}
result=RegCloseKey(hkey);
if (result!=ERROR_SUCCESS)
{
printf("failed to close key \n");
return -1;
}
return 0;
}


--------------------------------------------------------------------------------


Date :19.10.2002
Author:C-Duke
E-mail:c-duke#cydem.zp.ua

PM Jabber   Вверх
Fixin
Дата 12.1.2005, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Chipset
Цитата
http://msdn.com
http://firststeps.ru
Книга: Д. М. Харт, Системное программирование в среде win32, 2-е издание.

Спасибо, был.

Alexandr87
Спаибо, толковая статейка, но вместо
Код
RegCreateKey(HKEY_LOCAL_MACHINE,(char *) &path,&hkey);

надо
Код
RegCreateKey(HKEY_CURRENT_USER, path,&hkey);


Еще не все проверил.
PM MAIL ICQ   Вверх
Fixin
Дата 13.1.2005, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



RegDeleteKey(HKEY_LOCAL_MACHINE,"c-duke\0");
Вот это не работает. Пробовал так:
char s[] = "key\0";
result=RegDeleteKey(hkey, (char*)(&s));
И s[] повсякому менял...
Что не так? Не работает...
PM MAIL ICQ   Вверх
Fixin
Дата 13.1.2005, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



В NT-шках надо так:
Код
char s[] = "cduke\\new\0";
result=RegDeleteKey(HKEY_CURRENT_USER, (char*)(&s));
strcpy(s, "cduke\0");
result=RegDeleteKey(HKEY_CURRENT_USER, (char*)(&s));


В 9х так:
Код
char s[] = "cduke\0";
result=RegDeleteKey(HKEY_CURRENT_USER, (char*)(&s));


Вроде все.

PM MAIL ICQ   Вверх
SeregaLBN
Дата 15.1.2005, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.10.2003
Где: Киев

Репутация: нет
Всего: нет



Не на чистом API, но всё же...
Из не API используется только MFC CString. А если лень менять, см. "Реализация CString без MFC" на http://www.rsdn.ru/Forum/?mid=875632

Удаления мне пока не требовались, так что без них...

Код

// заголовок
class CRegistry {
public:
  // read methods
  static CString GetString(IN HKEY hKey, IN LPCTSTR szParameter);
  static DWORD   GetDWord (IN HKEY hKey, IN LPCTSTR szParameter);
  // write methods
  static VOID    SetString(IN HKEY hKey, IN LPCTSTR szParameter, IN LPCTSTR szValue);
  static VOID    SetDWord (IN HKEY hKey, IN LPCTSTR szParameter, IN DWORD   dwValue);

  // read methods
  static CString GetString(IN LPCTSTR szKeyName); // example - "HKEY_CURRENT_USER\SOFTWARE\strParam"
  static DWORD   GetDWord (IN LPCTSTR szKeyName); // example - "HKEY_CURRENT_USER\SOFTWARE\dwParam"
  // write methods
  static VOID    SetString(IN LPCTSTR szKeyName, IN LPCTSTR szValue); // example - "HKEY_CURRENT_USER\SOFTWARE\strParam", "value"
  static VOID    SetDWord (IN LPCTSTR szKeyName, IN DWORD   dwValue); // example - "HKEY_CURRENT_USER\SOFTWARE\dwParam", 123
};

Код

// CPP
// Прочитать из реестра значение заданного параметра
CString CRegistry::GetString(IN HKEY hKey, IN LPCTSTR szParameter) {
  CString strResult;
  DWORD dwErrCode = ERROR_SUCCESS;
  if (!hKey || !szParameter) {
     dwErrCode = ERROR_INVALID_PARAMETER;
  } else {
     int i=0;
     while (TRUE) {
        TCHAR szValueName[1024] = {0};
        DWORD dwSizeValueName=1024,
              dwType,
              dwSizeData=1024;
        BYTE pbData[1024] = {0};

        dwErrCode = ::RegEnumValue(hKey, i++, szValueName, &dwSizeValueName, NULL, &dwType, pbData, &dwSizeData);

        if (dwErrCode == ERROR_SUCCESS) {
           if ((dwType == REG_SZ) && (lstrcmpi(szParameter, szValueName) == 0)) {
              strResult = (LPCTSTR)pbData;
              break;
           }
        } else {
           break;
        }
     }
  }
  ::SetLastError(dwErrCode);
  return strResult;
}

// Прочитать из реестра значение заданного параметра
DWORD CRegistry::GetDWord(IN HKEY hKey, IN LPCTSTR szParameter) {
  DWORD dwResult = 0;
  DWORD dwErrCode = ERROR_SUCCESS;
  if (!hKey || !szParameter) {
     dwErrCode = ERROR_INVALID_PARAMETER;
  } else {
     int i=0;
     while (TRUE) {
        TCHAR szValueName[1024] = {0};
        DWORD dwSizeValueName=1024,
              dwType,
              dwSizeData=1024;
        BYTE pbData[1024] = {0};

        dwErrCode = ::RegEnumValue(hKey, i++, szValueName, &dwSizeValueName, NULL, &dwType, pbData, &dwSizeData);

        if (dwErrCode == ERROR_SUCCESS) {
           if ((dwType == REG_DWORD) && (lstrcmpi(szParameter, szValueName) == 0)) {
              dwResult = *((int*)pbData);
              break;
           }
        } else {
           break;
        }
     }
  }
  ::SetLastError(dwErrCode);
  return dwResult;
}

// Записать в реестр  значение заданного параметра
VOID CRegistry::SetString(IN HKEY hKey, IN LPCTSTR szParameter, IN LPCTSTR szValue) {
  DWORD dwErrCode = ERROR_SUCCESS;
  if (!hKey || !szParameter) {
     dwErrCode = ERROR_INVALID_PARAMETER;
  } else {
     dwErrCode = ::RegSetValueEx(hKey, szParameter, 0, REG_SZ, (LPBYTE)szValue, lstrlen(szValue)+1);                                      
  }
  ::SetLastError(dwErrCode);
}

// Записать в реестр  значение заданного параметра
VOID CRegistry::SetDWord(IN HKEY hKey, IN LPCTSTR szParameter, IN DWORD dwValue) {
  DWORD dwErrCode = ERROR_SUCCESS;
  if (!hKey || !szParameter) {
     dwErrCode = ERROR_INVALID_PARAMETER;
  } else {
     dwErrCode = ::RegSetValueEx(hKey, szParameter, 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));                                      
  }
  ::SetLastError(dwErrCode);
}

CString CRegistry::GetString(IN LPCTSTR szKeyName)
{
  DWORD dwErrCode = ERROR_SUCCESS;
  CString strResult;

  CString strKeyName(szKeyName);
  strKeyName.TrimLeft(TEXT('\\'));

  HKEY hKey = NULL;

  do {
     int iPos = strKeyName.Find(TEXT('\\'));
     if (iPos != -1) {
        CString strKey = strKeyName.Left(iPos);
        if (hKey == NULL) {
           if (strKey.CompareNoCase(TEXT("HKEY_CLASSES_ROOT"  )) == 0) hKey = HKEY_CLASSES_ROOT ; else
           if (strKey.CompareNoCase(TEXT("HKEY_CURRENT_USER"  )) == 0) hKey = HKEY_CURRENT_USER ; else
           if (strKey.CompareNoCase(TEXT("HKEY_LOCAL_MACHINE" )) == 0) hKey = HKEY_LOCAL_MACHINE; else
           if (strKey.CompareNoCase(TEXT("HKEY_USERS"         )) == 0) hKey = HKEY_USERS        ; else
           if (strKey.CompareNoCase(TEXT("HKEY_CURRENT_CONFIG")) == 0) hKey = HKEY_CURRENT_CONFIG; else {
              dwErrCode = ERROR_PATH_NOT_FOUND;
              break;
           }
        } else {
           dwErrCode = ::RegOpenKeyEx(hKey, strKey, 0, KEY_READ, &hKey);
           if (dwErrCode != ERROR_SUCCESS) {
              break;
           }
        }
        strKeyName = strKeyName.Mid(iPos+1);
     } else {
        strResult = CRegistry::GetString(hKey, strKeyName);
        dwErrCode = ::GetLastError();
        break;
     }
  } while (TRUE);

  ::SetLastError(dwErrCode);
  return strResult;
}

DWORD CRegistry::GetDWord(IN LPCTSTR szKeyName)
{
  DWORD dwErrCode = ERROR_SUCCESS;
  DWORD dwResult = 0;

  CString strKeyName(szKeyName);
  strKeyName.TrimLeft(TEXT('\\'));

  HKEY hKey = NULL;

  do {
     int iPos = strKeyName.Find(TEXT('\\'));
     if (iPos != -1) {
        CString strKey = strKeyName.Left(iPos);
        if (hKey == NULL) {
           if (strKey.CompareNoCase(TEXT("HKEY_CLASSES_ROOT"  )) == 0) hKey = HKEY_CLASSES_ROOT ; else
           if (strKey.CompareNoCase(TEXT("HKEY_CURRENT_USER"  )) == 0) hKey = HKEY_CURRENT_USER ; else
           if (strKey.CompareNoCase(TEXT("HKEY_LOCAL_MACHINE" )) == 0) hKey = HKEY_LOCAL_MACHINE; else
           if (strKey.CompareNoCase(TEXT("HKEY_USERS"         )) == 0) hKey = HKEY_USERS        ; else
           if (strKey.CompareNoCase(TEXT("HKEY_CURRENT_CONFIG")) == 0) hKey = HKEY_CURRENT_CONFIG; else {
              dwErrCode = ERROR_PATH_NOT_FOUND;
              break;
           }
        } else {
           dwErrCode = ::RegOpenKeyEx(hKey, strKey, 0, KEY_READ, &hKey);
           if (dwErrCode != ERROR_SUCCESS) {
              break;
           }
        }
        strKeyName = strKeyName.Mid(iPos+1);
     } else {
        dwResult = CRegistry::GetDWord(hKey, strKeyName);
        dwErrCode = ::GetLastError();
        break;
     }
  } while (TRUE);

  ::SetLastError(dwErrCode);
  return dwResult;
}

VOID CRegistry::SetString(IN LPCTSTR szKeyName, IN LPCTSTR szValue)
{
  DWORD dwErrCode = ERROR_SUCCESS;
  CString strResult;

  CString strKeyName(szKeyName);
  strKeyName.TrimLeft(TEXT('\\'));

  HKEY hKey = NULL;  

  do {
     int iPos = strKeyName.Find(TEXT('\\'));
     if (iPos != -1) {
        CString strKey = strKeyName.Left(iPos);
        if (hKey == NULL) {
           if (strKey.CompareNoCase(TEXT("HKEY_CLASSES_ROOT"  )) == 0) hKey = HKEY_CLASSES_ROOT ; else
           if (strKey.CompareNoCase(TEXT("HKEY_CURRENT_USER"  )) == 0) hKey = HKEY_CURRENT_USER ; else
           if (strKey.CompareNoCase(TEXT("HKEY_LOCAL_MACHINE" )) == 0) hKey = HKEY_LOCAL_MACHINE; else
           if (strKey.CompareNoCase(TEXT("HKEY_USERS"         )) == 0) hKey = HKEY_USERS        ; else
           if (strKey.CompareNoCase(TEXT("HKEY_CURRENT_CONFIG")) == 0) hKey = HKEY_CURRENT_CONFIG; else {
              dwErrCode = ERROR_BAD_PATHNAME;
              break;
           }
        } else {
           dwErrCode = ::RegCreateKey(hKey, strKey, &hKey);
           if (dwErrCode != ERROR_SUCCESS) {
              break;
           }
        }
        strKeyName = strKeyName.Mid(iPos+1);
     } else {
        CRegistry::SetString(hKey, strKeyName, szValue);
        dwErrCode = ::GetLastError();
        break;
     }
  } while (TRUE);

  ::SetLastError(dwErrCode);
}

VOID CRegistry::SetDWord(IN LPCTSTR szKeyName, IN DWORD dwValue)
{
  DWORD dwErrCode = ERROR_SUCCESS;
  CString strResult;

  CString strKeyName(szKeyName);
  strKeyName.TrimLeft(TEXT('\\'));

  HKEY hKey = NULL;  

  do {
     int iPos = strKeyName.Find(TEXT('\\'));
     if (iPos != -1) {
        CString strKey = strKeyName.Left(iPos);
        if (hKey == NULL) {
           if (strKey.CompareNoCase(TEXT("HKEY_CLASSES_ROOT"  )) == 0) hKey = HKEY_CLASSES_ROOT ; else
           if (strKey.CompareNoCase(TEXT("HKEY_CURRENT_USER"  )) == 0) hKey = HKEY_CURRENT_USER ; else
           if (strKey.CompareNoCase(TEXT("HKEY_LOCAL_MACHINE" )) == 0) hKey = HKEY_LOCAL_MACHINE; else
           if (strKey.CompareNoCase(TEXT("HKEY_USERS"         )) == 0) hKey = HKEY_USERS        ; else
           if (strKey.CompareNoCase(TEXT("HKEY_CURRENT_CONFIG")) == 0) hKey = HKEY_CURRENT_CONFIG; else {
              dwErrCode = ERROR_BAD_PATHNAME;
              break;
           }
        } else {
           dwErrCode = ::RegCreateKey(hKey, strKey, &hKey);
           if (dwErrCode != ERROR_SUCCESS) {
              break;
           }
        }
        strKeyName = strKeyName.Mid(iPos+1);
     } else {
        CRegistry::SetDWord(hKey, strKeyName, dwValue);
        dwErrCode = ::GetLastError();
        break;
     }
  } while (TRUE);

  ::SetLastError(dwErrCode);
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0574 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.