Описание функции WinMain() и её параметры и их значение пример

1) во-первых, если кто не знает - указатель типа void* может быть приведён к указателю с любым типом (тип, соответственно, должен быть "указательным")
и обратно без потери данных - то есть можно сказать что в этом смысле тип void * является в си этаким обобщённым указателем на память.

2) Движемся дальше . Помним, что наша функция имеет вид =

    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPi, LPSTR cCmdline, int nSs)

Что же это за типы данных? (источник = http://dims.karelia.ru/win32/)
Связь следующая (в виде кода определения нового типа в си) =

typedef void *HINSTANCE; /* дескриптор экземпляра программы */
typedef CHAR *LPSTR;

??? какая разницу между char и CHAR - это одно и тоже , просто "люди из майкрософт" написали что-то вроде того =
typedef char CHAR;

? ???

Теперь "о смысле" :

HINSTANCE hInst  = в эту переменную винда запишет адрес участка памяти , в котором разместится программа.
	  
	  HINSTANCE hPi  = а в эту переменную винда поместит указатель на предыдущий экземпляр программы.
	  LPSTR cCmdline  = указатель на строку, в которую будет размещена команда , набранная после имени запускаемой программы
	  int nSs = определяет вид, в котором появится окно.

Дело в том, что под виндоусом (по-моему это больше соответствует "windows" ,чем аналогичное "виндовс") одна и та же програ может быть запущены тыщу раз .
поэтому узрев в качестве значения hPi ноль в старые добрые времена - надо было немедленно понять,
что порамма ваша запущена на момент возвращения значения в первом и единственном экземпляре - но в WIN32 данный параметр оставлен исключительно для
совместимости с предыдущими версиями опять же винды.