我是_小明_ 2022-08-09 13:54 采纳率: 100%
浏览 83
已结题

给LPWSTR的变量赋LPSTR的类型值,提示错误,但能通过编译?

问题遇到的现象和发生背景

网上找了一段编写windows服务的框架代码,vsCode没有提示语法错误,但编译时报错,我的环境是vsCode+MinGW_10.0,使用g++命令编译。

问题相关代码

#include <Windows.h>
#include <stdio.h>
#define SERVICENAME L"ServiceDemo"

int main()
{
WCHAR ServiceName[] = SERVICENAME;
SERVICE_TABLE_ENTRY DispatchTable[2];
DispatchTable[0].lpServiceName = ServiceName; //此行为问题代码

}

运行结果及报错内容

img

我的解答思路和尝试过的方法

错误提示说不能将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类型的实体,但能够通过编译,并且能够成功运行。

img

我想要达到的结果

这里我就有点不理解了:为什么给LPWSTR的变量赋LPSTR的值,反而能通过编译。明明提示有错误啊?希望能够解下疑。

  • 写回答

2条回答 默认 最新

  • #include <bug> 2022-08-09 22:34
    关注

    在windows.h中有如下定义:
    typedef CHAR *NPSTR, *LPSTR, *PSTR;
    typedef char CHAR;
    LPSTR类型为 char * 类型,同理可得LPWSTR类型也为指针类型。不同的是,LPWSTR类型为指向以NULL结尾的16位双字节字符数组指针。同类型的指针赋值,因此能够通过编译,但是两个指针的指向方式不同,因此会有警告。
    WCHAR类型在头文件中被定义为宽字符,属于宽字符类型,与指针类型不同,因此编译器报错。

    望采纳!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月18日
  • 已采纳回答 8月10日
  • 创建了问题 8月9日

悬赏问题

  • ¥15 麒麟V10桌面版SP1如何配置bonding
  • ¥15 Marscode IDE 如何预览新建的 HTML 文件
  • ¥15 K8S部署二进制集群过程中calico一直报错
  • ¥15 java python或者任何一种编程语言复刻一个网页
  • ¥20 如何通过代码传输视频到亚马逊平台
  • ¥15 php查询mysql数据库并显示至下拉列表中
  • ¥15 freertos下使用外部中断失效
  • ¥15 输入的char字符转为int类型,不是对应的ascall码,如何才能使之转换为对应ascall码?或者使输入的char字符可以正常与其他字符比较?
  • ¥15 devserver配置完 启动服务 无法访问static上的资源
  • ¥15 解决websocket跟c#客户端通信