
微软不支持用C来开发Win32的原因,简单来说有3点:
1、C并不是应用开发语言
2、微软有C++类库MFC
3、微软甚至也不支持普通用户C++
下面我们分条阐述。
若你仔细去进行观察,那么你就会发觉,Windows的那个系统开发接口,也就是API,它是借助C语言来予以提供的。
为什么会这样?
不仅仅是Windows,Linux以及MacOS这般,它们所施行的做法是相同的,原因在于此。
几乎所有当下操作系统的首选是C语言,一方面,C语言可以对内存分配进行极为精细的控制,进而能够确保系统速度,另一方面,C语言与汇编指令相互混搭,从而直接对硬件进行操作。
从系统接口的这个特定角度来看,C所暴露出来的接口,在进行link操作的时候,能够确保不会发生改变,其兼容性是最为良好的。
早期就发布了Windows,微软当时是要让人们运用C语言方式去写程序。
很快,人们发现了一个问题。
仅仅是一个输出"Hello World"的GUI窗口类程序,居然就需要50至80行的代码程序。
大概如下:
plaintext
#include
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
// 1. 注册窗口类
WNDCLASS wc = {0};
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszClassName = L"HelloClass";
RegisterClass(&wc);
// 2. 创建窗口
HWND hwnd = CreateWindow(
L"HelloClass", // 窗口类名
L"Hello World", // 窗口标题
WS_OVERLAPPEDWINDOW, // 窗口样式
CW_USEDEFAULT, // X位置
CW_USEDEFAULT, // Y位置
400, // 宽度
300, // 高度
NULL, // 父窗口
NULL, // 菜单
hInstance, // 实例句柄
NULL); // 附加参数
if (!hwnd) return -1;
// 3. 显示窗口
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
// 4. 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
上头的那个程序里头,存在着数量众多的重复性质的代码,然而这是Windows所需要的,其中涵盖了:
1、注册窗口类
2、创建窗口
3、显示窗口
4、窗口消息处理
5、窗口退出函数(没错,这个也要写)
也就是说,Windows这个系统,对于使用者而言是很便利易于操作的,只要点点鼠标就能够使用,它是所谓"友好"的系统,然而呢,Windows编程可不是个轻松的活儿,它不是那种简单容易干的事,而是要写很多不少的代码,只有这样才可以把Windows编程给做好弄好。
对于从事编程工作的人员而言,尤其是在Windows早期的时候,众多Dos编程人员正是于这个阶段选择了告别编程,究其原因在于它的复杂程度实在是超乎想象,达到了令人难以应对的地步。而这般呈现出"断崖式"特征的离开情形,微软在事先是完全没有做好相应准备的。
那段时期,Windows尽管在用户群体那里热度极高,然而其开发却致使从事Windows开发的人员陷入极度的困扰之中,令他们的工作变得异常艰难!
那怎么办呢?
微软所走的道路,是将代码予以简化,借助当时最为流行的C++ ,达成这一点。
所以微软便推出了MFC,给出了一堆的类库以及VC这个开发厉害工具,所以一个hello World,成为了这般模样:
plaintext
#include
class CMyFrame : public CFrameWnd
{
public:
CMyFrame()
{
Create(NULL, _T("Hello MFC"), WS_OVERLAPPEDWINDOW,
CRect(100, 100, 500, 400));
}
};
class CMyApp : public CWinApp
{
public:
BOOL InitInstance()
{
m_pMainWnd = new CMyFrame();
m_pMainWnd->ShowWindow(m_nCmdShow);
return TRUE;
}
};
CMyApp theApp;
一下子清爽了好多,并且由于有App和Framework这两个类被添入,代码变得十分清新了,另外VC IDE增添了App Wizzard和Class Wizzard,还有Resource、Dialog这些具备可视化特性的"资源"工具,把Windows编程的门槛快速降低了,此次稳住了Windows开发的整体局面。
尽管是这样,然而C++并非是那种称得上"容易"的语言,对于专业从事开发工作的人员来讲依旧十分艰难。
哪怕到现在,C++程序员也不是很多。
微软怀揣着改变现状的想法,借助收购这一方式,买下了一家能提供"所见即所得"技术的公司,随后开发出了后来的Visual Basic。
这种开发方式,就是提供一个界面:

在这个界面当中,能够看到的情况是,一侧呈现的是一些在Windows时常会用到的控件,像按钮(Button)这般,列表(ListBox)也属于此类,还有下拉框(ComboBox)它们也在其中。用户能够凭借鼠标直接拖动到处于中间位置的空白Windows之上,进而便能够形成界面。要是想要对按钮(Button)的标题予以修改,仅仅借助"属性"窗口便达成目的!
按钮被用户双击之后,能够编写"Button_Clik"函数,以此来撰写对应的功能。
这般的界面,着实是极为契合"直觉"标准,刹那间便致使使用难度降低了九成,使得一名普通用户也能够迅速学会Windows开发了。
于是,微软就作出了分级。
普通用户,用Visual Basic来编程。
高级功能,比如说编写用户控件,就使用原本的Visual C++,交由高级用户去实现,与此同时,存在一些系统级别的功能,以ActiveX、COM组件的形式予以提供,这同样能够让高级用户来达成。
仰仗这种"高加上低"的搭配方式,Windows的开发形态如此这般就被确定下来了。
没错,在Java被研发出来以后呢,彼时微软便着手打造出了C#,进而取代了VB原本所占据的位置。
此刻,Windows平台那儿的开发,有着一种好似"日薄西山"这般情形的意味,更多的情形是运用Web技术经由Electronic这种具备跨平台特性的技术去开展编写。
想想过去那些Windows开发的岁月,让我想起了一首词。
它源自明代富有才学之士杨慎所创作的《临江仙·滚滚长江东逝水》,其具体内容是这样的:
plaintext
滚滚长江东逝水,
浪花淘尽英雄。
是非成败转头空。
青山依旧在,
几度夕阳红。
白发渔樵江渚上,
惯看秋月春风。
一壶浊酒喜相逢。
古今多少事,
都付笑谈中。
IT的江水滚滚向前,那里面有多少人的青春岁月啊!
我是明月,
一个互联网IT人!