WinMain即(函数运行入口):

C语言是面向过程的,而C++是面向对象的

//创建进程,获取进行相关信息,获取启动参数

int WINAPI WinMain (HINSTANCE hinstance,HINSTANCE
hPrevInstance,LPSTR  lpCmdLine,int  iCmdShow) 

C和C++的区别:

#include

{

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入进行运算处理得到输出控制)。

#include

  MessageBox(NULL,TEXT(“Hello,Window
98!”),TEXT(“HelloMSG”),0);

C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程控制。
所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“
设计这个概念已经被融入到C++之中 ”。

DWORD CreateChildProcess(LPTSTR szChildProcessCmd);

  return 0;

C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“
设计这个概念已经被融入到C++之中
”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

int main(int argc, PCHAR argv[]){

}

图片 1

CreateChildProcess(TEXT(“6.2子进程.exe misakanumber 99999”));

 

上次我们说了什么是windows编程?了解到Windows API
编程、Windows编程、Windows SDK 编程是一个概念。

return 0;

分析:

今天我们运用C语言来实现你的第一个真正的Windows程序。

}

WinMain的第一个参数一般叫做”实例句柄”(Instance
Handle),在Window程序中,句柄无非是一个数值,程序里用它来标识某些东西.

windows.h 头文件介绍:

//参加子进程

 

编写Windows程序,首先要包含 windows.h 头文件。windows.h
还包含了其他一些Windows头文件,例如:

DWORD CreateChildProcess(LPTSTR szChildProcessCmd){

第二个参数,是前一个实例的句柄.

windef.h:基本类型定义

STARTUPINFO si;

 

winbase.h:内核函数

PROCESS_INFORMATION pi;

比较早期的Windows版本中,当多路并发运行同一个程序时,就需要为那个程序创建多个实例.

wingdi.h:用户接口函数

ZeroMemory(&si, sizeof(si));//将启动信息结构清零

 

winuser.h: 图形设备接口函数

si.cb = sizeof(si);//设置结构大小

同一个程序的所有的实例都共享代码以及只读存储(即菜单或对话框模板之类的资源).一个程

这些头文件定义了Windows的所有数据类型、函数原型、数据结构和符号常量,也就是说,所有的Windows
API都在这些头文件中声明。

ZeroMemory(&pi, sizeof(pi));//将进程信息结构清零

 

在C语言中,程序都是“黑屏”的,称为控制台程序(Console
Application)。这套教程要讲的是带界面的Windows程序(Windows
Application),也称为GUI程序(GUI Application)。

//创建子进程,判断是否成功

序可以通过查看hPrevInstance参数从而知道是否有它的其他实例正在运行.

控制台程序以 main() 为入口函数,Windows程序以 WinMain()
为入口函数,动态链接库以 DllMain()
为入口函数,不同的入口函数决定了不同类型的程序。

if (!CreateProcess(

 

WinMain() 函数的原型为:

NULL,//使用命令行

在32Windows中,这一概念已不再采用,因此,Windows的第二个参数通常
总是NULL(定义为0).

int WINAPI WinMain(

szChildProcessCmd,//命令行

 

HINSTANCE hInstance, // 当前窗口句柄

NULL,//不继承进程句柄

WinMain的第三个参数是用来运行程序的命令行(Command Line).
有的Windows程序在启动时用它来把文件存入内存.

HINSTANCE hPrevInstance, //
前一个窗口句柄,Win32下为NULL(Win16留下的废物,目前已弃用)

NULL,//不继承线程句柄

 

LPSTR lpCmdLine, // 命令行参数

FALSE,//不继承句柄

WinMain的第四个参数用来指明程序最初如何显示:或正常显示,或最大化到全屏,或最小化显示在任务栏上.

int nCmdShow // 窗口显示方式

0,//没有创建标志

);

NULL,//使用父进程环境变量

先不要急于理解这些参数的含义,我先给大家写一个简单的不带黑屏的、真正的Windows程序:

NULL,//使用父进程目录作为当前目录

#include

&si,//启动信息结构

int WINAPI WinMain(

&pi//进程信息结构

HINSTANCE hInstance,

)){

HINSTANCE hPrevInstance,

printf(“创建进程失败: %d\n”, GetLastError());

LPSTR lpCmdLine,

return 1;

int nCmdShow

}

){

//创建成功后,父进程也可以直接退出,这里等待子进程执行结束

// 调用API 函数MessageBox

//hProcess为子进程句柄

int nSelect = MessageBox(NULL, TEXT, TEXT(), MB_OKCANCEL);

WaitForSingleObject(pi.hProcess, INFINITE);

if(nSelect == IDOK){

//关闭进程句柄和现成句柄

MessageBox(NULL, TEXT(“你点击了“确定”按钮”), TEXT, MB_OK);

CloseHandle(pi.hProcess);

}else{

CloseHandle(pi.hThread);

MessageBox(NULL, TEXT(“你点击了“取消”按钮”), TEXT, MB_OK);

return 0;

}

}

return 0;

源码

}

#include

运行结果:

#include

图片 2

#define MyAlloc(size) HeapAlloc(GetProcessHeap(),0,size)

点击“确定”或“取消”按钮,又会弹出一个新的提示框。大家可以亲自运行一下,会有真实的体验。

#define MyFree(lpMem) HeapFree(GetProcessHeap(),0,lpMem)

原来没有main()函数,没有#include 的C语言程序也是可以运行的!

typedef struct _PROCESS_INFO{

MessageBox()
函数是众多API中的一个,用于弹出一个指定风格的对话框,其原型为:

DWORD dwPid;

int WINAPI MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption,
UINT uType );

HANDLE hProcess;

WINAPI 为宏定义

DWORD dwPrioClass;

#define WINAPI
__stdcall,表示函数调用方式,暂时可以不理会,不影响代码编写,只需要知道MessageBox()返回值为
int,表示按下的按钮。

DWORD dwHandleCount;

参数说明

DWORD dwAffinityMask;

hWnd:该消息框的父窗口句柄,如果此参数为NULL,则该消息框没有拥有父窗口。大家不用急于理解这个参数,后续会详细讲解。

SIZE_T dwWorkingSetSizeMax;

lpText:消息框的内容。LPCTSTR 是自定义数据类型,等价于 const char *。

SIZE_T dwWorkingSetSizeMin;

lpCaption:消息框的标题。

LPWSTR szwCommandLine;

uType:对话框的按钮样式和图标。

STARTUPINFO sti;

uType 支持的按钮样式:

}PROCESS_INFO,*LPPROCESS_INFO;

图片 3

//全局变量

这些按钮都是宏定义

HANDLE hMySelf;

#define MB_OK 0x00000000L

DWORD GetProcessInfo(LPPROCESS_INFO lppi);

#define MB_OKCANCEL 0x00000001L

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR
lpCmdLine, int nCmdShow);

#define MB_ABORTRETRYIGNORE 0x00000002L

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR
lpCmdLine, int nCmdShow){

#define MB_YESNOCANCEL 0x00000003L

PROCESS_INFO pi;

#define MB_YESNO 0x00000004L

INT argc;

#define MB_RETRYCANCEL 0x00000005L

WCHAR **argv;

你也可以尝试用数字来表示按钮,例如:

INT i;

MessageBox(NULL, TEXT(“你好,欢迎源世界您!”), TEXT, 1);

DWORD dwBufferSize = lstrlen(lpCmdLine) + MAX_PATH + 1024;

也会生成与上面相同的对话框。

LPWSTR szShowBuffer = MyAlloc(dwBufferSize);

除了按钮,uType 还支持图标(图标对用户有提醒作用):

hMySelf = hInstance;

图片 4

//显示从WinMain函数参数得到的信息

这些图标也都是宏定义:

wsprintf(szShowBuffer, TEXT(“启动参数:\n实例句柄: %.8X, 命令行参数: %s,
显示选项: %.8X”), hInstance, lpCmdLine, nCmdShow);

#define MB_ICONHAND 0x00000010L

MessageBox(NULL, szShowBuffer, TEXT(“WinMain函数参数信息”), MB_OK);

#define MB_ICONQUESTION 0x00000020L

//使用自定义函数获取相关信息

#define MB_ICONEXCLAMATION 0x00000030L

GetProcessInfo(&pi);

#define MB_ICONASTERISK 0x00000040L

//将命令行参数分离

如果希望同时定义按钮和图标的样式,可以使用或运算|,例如:

argv = CommandLineToArgvW(pi.szwCommandLine, &argc);

MessageBox(

//字符显示

NULL,

*szShowBuffer = (WCHAR)NULL;

TEXT,

for (i = 0; i< argc; i++){

TEXT,

DWORD dwBufferSize = lstrlenW(*argv) + 1;

MB_OKCANCEL | MB_ICONINFORMATION

LPSTR szMBAargv = MyAlloc(dwBufferSize);

);

WideCharToMultiByte(CP_ACP, 0,*argv, -1, szMBAargv, dwBufferSize,
NULL, NULL);

把上面的MessageBox换成这个就ok了。运行结果

argv++;

与上面的对话框相比,多出了一个图标,同时还能听到提示音。是不是多了一个提示符号在文字的前面啊。

lstrcat(szShowBuffer, TEXT(“\n”));

再看来一下MessageBox() 的返回值。

lstrcat(szShowBuffer, szMBAargv);

MessageBox()
返回被按下的按钮,以数字表示,这些数字都被定义成了宏,如下所示:

MyFree(szMBAargv);

图片 5

}

对应的宏定义为:

MessageBoxW(NULL, szShowBuffer, TEXT(“参数”), MB_OK);

#define IDOK 1

MyFree(szShowBuffer);

#define IDCANCEL 2

//打印其他信息 TODO

#define IDABORT 3

return 0;

#define IDRETRY 4

}

#define IDIGNORE 5

//获取进程相关信息,保存到PROCESS_INFO结构中

#define IDYES 6

DWORD GetProcessInfo(LPPROCESS_INFO lppi){

#define IDNO 7

lppi->dwPid = (DWORD)GetCurrentProcessId;//PID

图片 6

lppi->hProcess = GetCurrentProcess();//句柄

小编推荐一个学C语言/C++的学习裙【 七三零,一三零,二二一
】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

lppi->dwPrioClass = GetPriorityClass(hMySelf);//优先级

总结:

//句柄计数,xp sdk新增的API…无语,现在都win7了

对于刚刚学完C语言的,学windows编程的,这些都是满满的干货,一定要记住喔。从你学windows编程开始,你就已经告别了难看的windows
do界面,只要一步一步走,写一个漂亮的window程序不在话下。这些都是以后学习必须掌握的,先收藏吧!

//lppi->dwHandleCount = GetProcessHandleCount(lppi->hProcess,
&lppi->dwHandleCount);

这些是C/C++能做的

//AffinityMask

服务器开发工程师、人工智能、云计算工程师、信息安全、大数据
、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等

GetProcessAffinityMask(hMySelf, &lppi->dwAffinityMask, NULL);

图片 7图片 8图片 9

//WorkingSetSize

GetProcessWorkingSetSize(hMySelf, &lppi->dwWorkingSetSizeMin,
&lppi->dwWorkingSetSizeMax);

lppi->szwCommandLine = GetCommandLineW();

//启动信息

GetStartupInfo(&lppi->sti);

return 0;

}

相关文章