Windows Store 平台移植 —— (3) 补充基础功能 API

常用的基础功能 API 包括:

  • 内存管理
  • 内存映射
  • 调试输出
  • 系统信息
  • 时间
  • 环境变量
  • 字符集
  • 动态库管理

下列 API 在 Windows Store 环境下缺失:

缺失API实现方法说明
LocalAllocnew []对原有功能进行简化
LocalFreedelete [] 
CreateFileMappingWCreateFileMappingFromApp 
CreateFileMappingACreateFileMappingW 
OpenFileMappingWCreateFileMappingW利用CreateFileMappingW的打开现有文件映射功能
OpenFileMappingAOpenFileMappingW 
MapViewOfFileMapViewOfFileFromApp 
MapViewOfFileExMapViewOfFileFromApp不能支持固定地址映射
VirtualAlloc 通过文件映射分配虚拟地址空间
VirtualFreeUnmapViewOfFile 
FormatMessageAFormatMessageW不支持FORMAT_MESSAGE_ALLOCATE_BUFFER
OutputDebugStringAOutputDebugStringW 
GetTickCountGetTickCount64 
GetSystemInfoGetNativeSystemInfo 
GetEnvironmentStrings 自行实现
GetEnvironmentVariable 自行实现
SetEnvironmentVariable 自行实现
LCMapStringALCMapStringEx 
LCMapStringALCMapStringW需要注意LCMAP_SORTKEY
GetStringTypeExAGetStringTypeExW 
FileTimeToLocalFileTime 通过多个时间转换 API 实现
GetModuleHandleWLoadPackagedLibrary 
GetModuleHandleAGetModuleHandleW 
LoadLibraryWLoadPackagedLibrary 
LoadLibraryALoadLibraryW 
GetModuleFileNameWWindows::ApplicationModel::Package只支持hModule==NULL情形
GetModuleFileNameAGetModuleFileNameW 
  • OpenFileMapping

因为 CreateFileMapping 可以打开已存在的文件映射,所以 OpenFileMapping 可以通过 CreateFileMapping 实现,如果 CreateFileMapping 有错误 ERROR_ALREADY_EXISTS,应该清除该错误。

  • MapViewOfFileEx
MapViewOfFileFromApp 不支持固定地址映射,所以 MapViewOfFileEx 的 lpBaseAddress 参数必须为 NULL,好在固定地址映射并不常用。
  • VirtualAlloc
这个 API 通过用文件映射实现,尽管有点大材小用。实现 VirtualAlloc,需要先创建文件映射,然后映射到虚拟地址,再关闭文件映射句柄。(CreateFileMapping + MapViewOfFile + CloseHandle),根据 MSDN 文档的说法,关闭文件映射句柄不影响映射内存有效性。
  • FormatMessageA
在 Windows Store  环境中, FormatMessageA 的 UNICODE 版本 FormatMessageW 可以调用,但是 FORMAT_MESSAGE_ALLOCATE_BUFFER 标志位无效,所以要自己声请内存。
  • GetEnvironmentStrings
  • GetEnvironmentVariable
  • SetEnvironmentVariable
Windows Store 没有环境变量相关的 API 可用,好在没有多少程序必须要用到环境变量,一般作为可选的外部配置项使用,因此可用构建一个自定义的环境变量集合来实现这些 API。常用的环境变量有 TMP(临时目录)。
  • LCMapString
Windows Store 有 LCMapStringEx 可用。需要注意的是,当 LCMAP_SORTKEY 标志位设置时,作为返回的 lpDestStr 内容填充的不是字符数据,在 ASCII 版本的实现中不需要做字符集转换。
  • FileTimeToLocalFileTime
通过 FileTimeToSystemTime、SystemTimeToTzSpecificLocalTime、SystemTimeToFileTime 三次时间转换实现。
  • GetModuleHandle
  • LoadLibrary
Windows Store 加载链接库需要使用 LoadPackagedLibrary。GetModuleHandle 的 UINCODE、ASCII 版本,以及 LoadLibrary 的 UINCODE、ASCII 版本都可以通过该 API 实现。
  • GetModuleFileName
GetModuleFileName 一般用来获取本进程的可执行文件路径名,此时参数 hModule 为 NULL。在 Windows Store 中,可执行文件路径其实是安装目录(Windows::ApplicationModel::Package::Current->InstalledLocation->Path)加上安装包名称(Windows::ApplicationModel::Package::Current->Id->Name)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting Horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值