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

给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日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度