Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Трудности в понимании кода (С++) WinAPI

84K
19 сентября 2012 года
Minion
4 / / 19.09.2012
Здравствуйте, уважаемые коллеги.

Сейчас изучаю WinAPI, и составляя простенькую программу снятия данных о системе, воспользовался хелпом в VisualStudio 2008, получив вот такой код:

Код:
#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <conio.h>

TCHAR* envVarStrings[] =     //Место 1
{
  TEXT("OS         = %OS%"),
  TEXT("PATH       = %PATH%"),
  TEXT("HOMEPATH   = %HOMEPATH%"),
  TEXT("TEMP       = %TEMP%")
};                                                                            //Конец Места 1

#define  ENV_VAR_STRING_COUNT  (sizeof(envVarStrings)/sizeof(TCHAR*))
#define INFO_BUFFER_SIZE 32767
void printError( TCHAR* msg );

void main( )
{
  DWORD i;
  TCHAR  infoBuf[INFO_BUFFER_SIZE];
  DWORD  bufCharCount = INFO_BUFFER_SIZE;
 
  // Get and display the name of the computer.
  bufCharCount = INFO_BUFFER_SIZE;
  if( !GetComputerName( infoBuf, &bufCharCount ) )
    printError( TEXT("GetComputerName") );
  _tprintf( TEXT("\nComputer name:      %s"), infoBuf );
 
  // Get and display the user name.
  bufCharCount = INFO_BUFFER_SIZE;
  if( !GetUserName( infoBuf, &bufCharCount ) )
    printError( TEXT("GetUserName") );
  _tprintf( TEXT("\nUser name:          %s"), infoBuf );
 
  // Get and display the system directory.
  if( !GetSystemDirectory( infoBuf, INFO_BUFFER_SIZE ) )
    printError( TEXT("GetSystemDirectory") );
  _tprintf( TEXT("\nSystem Directory:   %s"), infoBuf );
 
  // Get and display the Windows directory.
  if( !GetWindowsDirectory( infoBuf, INFO_BUFFER_SIZE ) )
    printError( TEXT("GetWindowsDirectory") );
  _tprintf( TEXT("\nWindows Directory:  %s"), infoBuf );
 
  // Expand and display a few environment variables.
  _tprintf( TEXT("\n\nSmall selection of Environment Variables:") );
  for( i = 0; i < ENV_VAR_STRING_COUNT; ++i )
  {
    bufCharCount = ExpandEnvironmentStrings(envVarStrings[i], infoBuf,
        INFO_BUFFER_SIZE );
    if( bufCharCount > INFO_BUFFER_SIZE )
      _tprintf( TEXT("\n\t(Buffer too small to expand: \"%s\")"),
              envVarStrings[i] );
    else if( !bufCharCount )
      printError( TEXT("ExpandEnvironmentStrings") );
    else
      _tprintf( TEXT("\n   %s"), infoBuf );
  }
  _tprintf( TEXT("\n\n"));
  getch();
}

void printError( TCHAR* msg )
{
  DWORD eNum;
  TCHAR sysMsg[256];
  TCHAR* p;

  eNum = GetLastError( );
  FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM |
         FORMAT_MESSAGE_IGNORE_INSERTS,
         NULL, eNum,
         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
         sysMsg, 256, NULL );

  // Trim the end of the line and terminate it with a null
  p = sysMsg;
  while( ( *p > 31 ) || ( *p == 9 ) )                                      // Место 2
    ++p;
  do { *p-- = 0; } while( ( p >= sysMsg ) &&
                          ( ( *p == '.' ) || ( *p < 33 ) ) );
                                                                                               // Конец Места 2
  // Display the message
  _tprintf( TEXT("\n\t%s failed with error %d (%s)"), msg, eNum, sysMsg );
}
И я не могу никак понять его некоторые части: помеченные комментариями // Место 1 - //Конец Места 1, и т.д.
Несмотря на то, что очевидно трудных мест для меня всего два (пока), я привел код из хелпа целиком, на случай, если проблемные места тесно связаны с остальным кодом.
Не мог бы мне кто-нибудь помочь разобрать код?

Спасибо.
414
19 сентября 2012 года
CassandraDied
763 / / 24.05.2012
1) Обычно описание массива строк. Макрос ТЕХТ выбирает, будут строки в юникоде или нет. А далее ExpandEnvironmentStrings заменяет названия переменных среды их значениями.
2)"Trim the end of the line and terminate it with a null" же. До тех пор, пока символ является цифрой\буквой или табом, сдвигать указатель вперёд(к концу строки). А потом все символы "." и нечитабельные символы, которых, по идее, быть уже не должно, зануляются.
Было бы хорошо посмотреть отладчиком, что там такого нужно стирать. А то бред какой-то получается.
UPD: под отладкой была удалена только точка в самом конце. Не понятно, какие ещё символы там могут быть и зачем их удалять таким способом.
Хоть код и находится на MSDN, он очень странный. Старый, видимо. Лучше его не использовать.
84K
19 сентября 2012 года
Minion
4 / / 19.09.2012
Спасибо за ответ, быстрый и информативный. Но не могли бы Вы сделать ссылку на ресурс или издание, где я мог бы узнать о таких макросах, как в "Место 1"?
414
19 сентября 2012 года
CassandraDied
763 / / 24.05.2012
Цитата: Minion
Спасибо за ответ, быстрый и информативный. Но не могли бы Вы сделать ссылку на ресурс или издание, где я мог бы узнать о таких макросах, как в "Место 1"?


Конечно. Ссылка.

84K
19 сентября 2012 года
Minion
4 / / 19.09.2012
Спасибо еще раз).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог