You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++Builder 10.4.1调用SendMailMapi()安装Win10 SDK后出现访问违例

问题诱因

这个问题的核心原因是两个不同来源的MAPI头文件定义冲突,具体触发逻辑如下:

  • 未安装Windows 10 SDK的设备上,C++Builder编译时只会使用自身携带的Winapi.Mapi.hpp头文件,其中封装的MAPI相关结构体(TMapiMessage、TMapiRecipDesc等)、函数签名与你代码中使用的AnsiString(多字节字符集)完全匹配,结构体内存布局、字符串指针类型都符合预期,因此运行正常。
  • 安装Windows 10 SDK的设备上,编译时INCLUDE路径会优先指向SDK的头文件目录,你代码中同时引入了<Winapi.Mapi.hpp>和<mapi.h>,此时会优先使用Win10 SDK自带的mapi.h定义:
    • 若SDK的mapi.h默认启用Unicode字符集,结构体中的字符串字段为宽字符指针LPWSTR,但你代码传入的是AnsiString::c_str()返回的多字节char*,MAPISendMail执行时会将窄指针当作宽指针访问内存,直接触发访问违例。
    • 即使字符集匹配,SDK的MAPI结构体定义、字段对齐规则也可能和C++Builder自带的Winapi.Mapi.hpp定义不一致,导致结构体内存布局错位,函数调用时读取参数错误触发访问异常。

修复方案

  • 移除代码中多余的#include <mapi.h>,仅保留C++Builder官方封装的Winapi.Mapi.hpp即可,避免头文件冲突。
  • 若必须使用SDK版本的MAPI,需统一字符集:将代码中所有传入MAPI结构体的字符串改为宽字符类型(使用WideString代替AnsiString),确保指针类型匹配。

内容的提问来源于stack exchange,提问作者tom l

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 23:33:03