重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
windows是一个大型的系统软件,分成很多个部分,由很多名程序员分别完成的。每个程序员可能都有自己擅长的一种编程语言,各自使用自己擅长的语言(可能是c、c++、vb…………)编写程序完成自己所负责的那部分程序功能,然后再编译,组合成最后的windows操作系统软件。整个过程类似工厂里面生产大型设备,各自完成不同部件之后再组装。
创新互联建站主营刚察网站建设的网络公司,主营网站建设方案,app软件开发公司,刚察h5小程序制作搭建,刚察网站营销推广欢迎刚察等地区企业咨询
根据几年前微软在美国公布的内容,windows本身属于微内核系统,windows98总共大概不到10万行代码(具体是2万还是5万记不清了),而windows2000则已经有20余万行代码,其中80%是用c++编写,其余部分有c和汇编,底层接口用汇编编写。
微内核系统从概念上是指“只包括操作系统的基本功能,例如内存管理和进程管理等等”,就连对各个文件系统的支持也不算在内,不过具体windows是不是这样设计我就不清楚了。
所以一个微内核系统的操作系统能够有20万行代码已经很多了。
之所以微软选择了c++而不想linux一样选择c,其根本原因就是windows操作系统本身是微内核系统,所以扩展性及以后的维护要求非常重要,所以c++的类的概念就能在这里很好的利用,但是毕竟c++的效率不如标准c及汇编,所以在一些明显以效率为重的地方用的还是标准c及汇编。
编写完毕后,windows上的其他用户态程序(包括所有驱动程序、计算器、游戏等等所有你现在拿鼠标能够操作的东西)另行开发,例如:扫雷游戏就是用vb写的。
首先Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows
会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这使服务非常适合在服务器上使
用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上
下文中运行服务。
服务是有状态的,当我们使用windows自带的服务管理程序sc.exe查看服务状态时可以显示服务的当前状态,这个状态是由我们在程序代码中进
行控制的。你最好在服务初始化的时候将服务设置为SERVICE_START_PENDING,当初始化完毕时设为SERVICE_RUNNING,这些
状态是系统自定义的状态,可通过msdn查看其他状态。这个状态信息你会在sc.exe中看到。
在编写windows服务程序过程中你需要关注的函数有:
1.首先是main函数,由于windows服务不需要界面,所以大部分程序为win32控制台应用程序,所以程序主函
数为main 而不是WinMain()。在主函数要做的主要工作就是初始化一个SERVICE_TABLE_ENTRY
分派表结构体,然后调用StartServiceCtrlDispatcher();这将把调用进程的主线程转换为控制分派器。该分派器启动一个新线程,
该线程运行分派表中对应于你的服务的ServiceMain()函数。ServiceMain()函数将在下面提到。
此过程示例代码如下:
SERVICE_TABLE_ENTRY entrytable[2];
entrytable[0].lpServiceName="testservice";
entrytable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;
entrytable[1].lpServiceName=NULL;
entrytable[1].lpServiceProc=NULL;
StartServiceCtrlDispatcher(entrytable);
在这之后系统将自动创建一个线程去执行ServiceMain函数的内容,你应该将你要执行的任务在ServiceMain中循环,这样服务就开始运行了。
2.ServiceMain函数为void WINAPI ServiceMain(int argc, char**
argv)格式的函数,函数名字可以任意定义。它的作用就是:将你需要执行的任务放到该函数中循环执行即可。这就是服务程序的工作函数。在
ServiceMain执行你的任务前,需要给SERVICE_TABLE_ENTRY
分派表结构体进行赋值,注意由于此时服务还没有开始执行你的任务所以我们将服务的状态设置为SERVICE_START_PENDING,即正在初始化。
我们进行如下赋值:
servicestatus.dwServiceType = SERVICE_WIN32;
servicestatus.dwCurrentState = SERVICE_START_PENDING;
servicestatus.dwControlsAccepted=SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP;
//在本例中只接受系统关机和停止服务两种控制命令
servicestatus.dwWin32ExitCode = 0;
servicestatus.dwServiceSpecificExitCode = 0;
servicestatus.dwCheckPoint = 0;
servicestatus.dwWaitHint = 0;
hstatus = ::RegisterServiceCtrlHandler("testservice", CtrlHandler);
CtrlHandler为void WINAPI CtrlHandler(DWORD request)型的函数,函数名字可以任意设定。将在下一点讲到。
Hstatus为SERVICE_STATUS_HANDLE类型的全局变量。当需要改变服务状态时SetServiceStatus()函数需要它做为参数来标识一个服务。
3. void WINAPI CtrlHandler(DWORD
request),函数的主要功能是,接收系统传递的控制命令,比如当你通过sc.exe关闭服务时,该函数会收到
SERVICE_CONTROL_STOP消息,你就可以对服务进行必要的管理。在本例子程序中就只接收SERVICE_ACCEPT_SHUTDOWN
和SERVICE_ACCEPT_STOP消息,这是通过前面给servicestatus赋值设定的。
这样一个基本的服务程序就完成了。
下面贴出我的示例代码仅供参考。该代码在vs2008中调试通过。本文结束的时候会附上如何安装服务。
#include stdio.h
#include Windows.h
#define SLEEP_TIME 5000 //间隔时间
#define FILE_PATH "C:\\log.txt" //信息输出文件
bool brun=false;
SERVICE_STATUS servicestatus;
SERVICE_STATUS_HANDLE hstatus;
int WriteToLog(char* str);
void WINAPI ServiceMain(int argc, char** argv);
void WINAPI CtrlHandler(DWORD request);
int InitService();
int WriteToLog(char* str)
{
FILE* pfile;
fopen_s(pfile,FILE_PATH,"a+");
if (pfile==NULL)
{
return -1;
}
fprintf_s(pfile,"%s\n",str);
fclose(pfile);
return 0;
}
void WINAPI ServiceMain(int argc, char** argv)
{
servicestatus.dwServiceType = SERVICE_WIN32;
servicestatus.dwCurrentState = SERVICE_START_PENDING;
servicestatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP;//在本例中只接受系统关机和停止服务两种控制命令
servicestatus.dwWin32ExitCode = 0;
servicestatus.dwServiceSpecificExitCode = 0;
servicestatus.dwCheckPoint = 0;
servicestatus.dwWaitHint = 0;
hstatus = ::RegisterServiceCtrlHandler("testservice", CtrlHandler);
if (hstatus==0)
{
WriteToLog("RegisterServiceCtrlHandler failed");
return;
}
WriteToLog("RegisterServiceCtrlHandler success");
//向SCM 报告运行状态
servicestatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus (hstatus, servicestatus);
//下面就开始任务循环了,你可以添加你自己希望服务做的工作
brun=true;
MEMORYSTATUS memstatus;
char str[100];
memset(str,'\0',100);
while (brun)
{
GlobalMemoryStatus(memstatus);
int availmb=memstatus.dwAvailPhys/1024/1024;
sprintf_s(str,100,"available memory is %dMB",availmb);
WriteToLog(str);
Sleep(SLEEP_TIME);
}
WriteToLog("service stopped");
}
void WINAPI CtrlHandler(DWORD request)
{
switch (request)
{
case SERVICE_CONTROL_STOP:
brun=false;
servicestatus.dwCurrentState = SERVICE_STOPPED;
break;
case SERVICE_CONTROL_SHUTDOWN:
brun=false;
servicestatus.dwCurrentState = SERVICE_STOPPED;
break;
default:
break;
}
SetServiceStatus (hstatus, servicestatus);
}
void main()
{
SERVICE_TABLE_ENTRY entrytable[2];
entrytable[0].lpServiceName="testservice";
entrytable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;
entrytable[1].lpServiceName=NULL;
entrytable[1].lpServiceProc=NULL;
StartServiceCtrlDispatcher(entrytable);
}
如何安装服务:
运行命令提示符 cmd.exe
输入 sc create testservicename binpath= D:\test.exe
输入 sc start testservicename 启动服务
输入sc query 会在最底部显示你的服务当前的状态
输入 sc stop testservicename 停止服务
输入 sc delete testservicename删除服务,该服务将在下次重启后删除,在重启之前将不能注册同一个名字的服务。
区别:
1、概括的说就是C是控制台应用程序,就是运行时出现一个就像dos黑色窗口,而widows程序设计是窗口应用程序,就像WORD,记事本等这样的有窗口框架的程序设计。还有就是他们的编程思想不同,C语言是面向过程的,可以理解为顺序的执行;而Widows是面向过程的,事件触发,模块化的编程思想,如果学过VB的话就很容易理解。另外C的程序入口函数是main,windows程序的入口函数是Winmain,windows定义了很多句柄和宏定义,刚开始理解起来有些困难,比如int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
《WINDOWS程序设计》:初级或中级程序员看的
《WINDOWS核心编程》:高级和系统程序员看的
2、所谓初中级程序员,就是编些普通应用程序。比如扫雷。 所谓高级程序员,就是编写硬件驱动之类的,大型应用程序,比如解霸。系统程序员,编写底层驱动,系统平台,超大型应用程序,word,瑞星之类 。
3、它们和C语言的主要区别是,C++不是专门为Windows程序所发明的语言,其它平台,如Mac和Linux都可以用C++,只不过Visual C++在它们上没办法运行就是了。另外一点,C++不是Java,不带自己的图形界面设计包。所以面向用户的界面要由其它程序来完成,这才是VC的主要目的,单纯用C++是不行的。
4、简单地说就是利用windows的应用程序接口(API),编写windows程序。
一般用C/C++;
如果用c,就是直接用这些API。
如果用C++,就用MFC(微软基础类库,封装了windows 的API)。
可以采用start命令来运行。在windows
xp的命令提示符中输入:start/seperate要运行的程序,即可运行相应的dos程序。其中参数separate的作用是在单独的内存空间启动16位程序,而用参数shared则是在共享的内存空间启动16位程序。当dos程序运行后我们还可按“alt+enter”键在全屏幕与窗口之间进行切换。
windows 编程就是编译的程序可以在windows环境下运行 可以用的语言很多了,如VB,VC,Delphi,java,C#等等,很多编程软件要调用系统的API函数,MFC,微软基础类(Microsoft Foundation Classes),同VCL(delphi的库)类似,是一种Application Framework,随微软Visual C++ 开发工具发布。