一针见血:error C2146: 语法错误 : 缺少“;”

最近用VC7做一个小软件,主要的功能是定时扫描GPRS接收过来的数据,并存放在数据库里。要求把软件注册成为windows服务。在所有的工作做完以后,我着手实现这部分功能。其实完全不用在程序中写入任何代码,只需要执行一个批处理文件,便可完美地打成服务了。但我还是想试一下用程序怎么实现这个功能。
在VC知识库里,找到一篇文章,其实原理并不难,无非是把程序的切入口,由main函数转换到服务控制台上去。文章的名字叫《用 C 语言编写 Windows 服务程序的五个步骤》,有兴趣的朋友可以参考一下。在这里要说的是,我用的VS2003做为开发工具,与VC6有一定差别,比如main和_tmain,在引用的头文件里,也有些许不同。当我把程序封装成服务的形式,发现出了一堆错误,搞了一天,也不知道是哪里的问题。最后,左思右想,百度谷歌,终于找到了问题的本质。归为一句话就是要“注意引用头文件的先后顺序”!这个问题说大不大,说小不小,错误难找,很让人头疼。写下此文,告之遇到类似问题的朋友们,你们的程序没有错误,但请改变一下引用的H文件的顺序!像我这个例子来说,顺序如下:
#include "stdafx.h"
#include <winsvc.h>
如果颠倒了,就会出现下面一堆令人头疼的错误:

正在编译...
ServerTest.cpp
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(58) : error C2146: 语法错误 : 缺少“;”(在标识符“hServStatus”的前面)
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(58) : error C2501: “hServStatus” : 缺少存储类或类型说明符
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(59) : error C2146: 语法错误 : 缺少“;”(在标识符“hSStat”的前面)
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(59) : error C2501: “hSStat” : 缺少存储类或类型说明符
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(75) : error C2065: “SERVICE_TABLE_ENTRY” : 未声明的标识符
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(75) : error C2146: 语法错误 : 缺少“;”(在标识符“DispatchTable”的前面)
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(75) : error C2065: “DispatchTable” : 未声明的标识符
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(75) : error C2059: 语法错误 : “]”
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(75) : error C2143: 语法错误 : 缺少“;”(在“{”的前面)
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(76) : error C2143: 语法错误 : 缺少“;”(在“}”的前面)
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(76) : warning C4550: 表达式计算为缺少参数列表的函数
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(76) : error C2143: 语法错误 : 缺少“;”(在“,”的前面)
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(77) : error C2143: 语法错误 : 缺少“;”(在“{”的前面)
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(77) : error C2143: 语法错误 : 缺少“;”(在“}”的前面)
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(80) : error C3861: “StartServiceCtrlDispatcher”: 即使使用参数相关的查找,也未找到标识符
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(80) : error C3861: “DispatchTable”: 即使使用参数相关的查找,也未找到标识符
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(87) : error C2065: “SC_HANDLE” : 未声明的标识符
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(87) : error C2146: 语法错误 : 缺少“;”(在标识符“schSCManager”的前面)
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(87) : error C2065: “schSCManager” : 未声明的标识符
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(88) : error C2146: 语法错误 : 缺少“;”(在标识符“schService”的前面)
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(88) : error C3861: “SC_HANDLE”: 即使使用参数相关的查找,也未找到标识符
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(88) : error C2065: “schService” : 未声明的标识符
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(99) : error C2065: “SC_MANAGER_ALL_ACCESS” : 未声明的标识符
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(99) : error C3861: “schSCManager”: 即使使用参数相关的查找,也未找到标识符
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(99) : error C3861: “OpenSCManager”: 即使使用参数相关的查找,也未找到标识符
e:\Project C++\ServerTest\ServerTest\ServerTest\ServerTest.cpp(101) : error C3861: “schSCManager”: 即使使用参数相关的查找,也未找到标识符
......
如果引用顺序正确了,你的程序就会像越狱第三季中的那个监狱老大说的一样:如蓝天般明朗。
posted @ 2008-12-31 08:47  Haven  阅读(14261)  评论(2编辑  收藏  举报