网上找了一段编写windows服务的框架代码,vsCode没有提示语法错误,但编译时报错,我的环境是vsCode+MinGW_10.0,使用g++命令编译。
#include
#include
#define SERVICENAME L"ServiceDemo"
int main()
{
WCHAR ServiceName[] = SERVICENAME;
SERVICE_TABLE_ENTRY DispatchTable[2];
DispatchTable[0].lpServiceName = ServiceName; //此行为问题代码
}
错误提示说不能将WCHAR转换为LPSTR,我查看了DispatchTable[0].lpServiceName在winsvc.h中定义,它是LPWSTR类型,跟LPSTR没有关系啊?
typedef struct _SERVICE_TABLE_ENTRYW {
LPWSTR lpServiceName;
LPSERVICE_MAIN_FUNCTIONW lpServiceProc;
} SERVICE_TABLE_ENTRYW,*LPSERVICE_TABLE_ENTRYW;
我又尝试给DispatchTable[0].lpServiceName赋一个LPSTR的值,
LPSTR MyServerName = (LPSTR)"MyServer";
DispatchTable[0].lpServiceName = MyServerName;
结果vsCode提示语法错误:不能将LPSTR类型的值分配到LPWSTR类型的实体,但能够通过编译,并且能够成功运行。
这里我就有点不理解了:为什么给LPWSTR的变量赋LPSTR的值,反而能通过编译。明明提示有错误啊?希望能够解下疑。
在windows.h中有如下定义:
typedef CHAR *NPSTR, *LPSTR, *PSTR;
typedef char CHAR;
LPSTR类型为 char * 类型,同理可得LPWSTR类型也为指针类型。不同的是,LPWSTR类型为指向以NULL结尾的16位双字节字符数组指针。同类型的指针赋值,因此能够通过编译,但是两个指针的指向方式不同,因此会有警告。
WCHAR类型在头文件中被定义为宽字符,属于宽字符类型,与指针类型不同,因此编译器报错。
供参考:https://blog.csdn.net/bichenggui/article/details/4559542