在构建通用 Windows 平台 (UWP) 应用时,许多 C 运行时 (CRT) 函数不可用。 有时有可用的解决方法,例如,您可以使用 Windows 运行时或 Win32 API。 在其他情况下,CRT 函数已被禁止,因为相应的功能或支持 API 不适用于 UWP 应用。 若要查找 Windows 运行时支持的替代方法,请参阅 UWP 应用中 Windows API 的替代方法。
下表列出了在构建 UWP 应用时不可用的 CRT 函数。 它指示任何适用的解决方法。
不支持的 CRT 函数
功能 | DESCRIPTION | 解决方法 |
---|---|---|
_beep
_sleep
_seterrormode
|
这些函数在早期版本的 CRT 中已过时。 此外,相应的 Win32 API 不适用于 UWP 应用。 | 无解决方法。 |
chdir
_chdrive
getcwd
|
这些函数已过时或不是线程安全的。 | 使用 _chdir , _getcwd 以及相关函数。 |
_cgets
_cgets_s
_cgetws
_cgetws_s
_cprintf
_cprintf_l
_cprintf_p
_cprintf_p_l
_cprintf_s
_cprintf_s_l
_cputs
_cputws
_cscanf
_cscanf_l
_cscanf_s
_cscanf_s_l
_cwait
_cwprintf
_cwprintf_l
_cwprintf_p
_cwprintf_p_l
_cwprintf_s
_cwprintf_s_l
_cwscanf
_cwscanf_l
_cwscanf_s
_cwscanf_s_l
_vcprintf
_vcprintf_l
_vcprintf_p
_vcprintf_p_l
_vcprintf_s
_vcprintf_s_l
_vcwprintf
_vcwprintf_l
_vcwprintf_p
_vcwprintf_p_l
_vcwprintf_s
_vcwprintf_s_l
_getch
_getch_nolock
_getche
_getche_nolock
_getwch
_getwch_nolock
_getwche
_getwche_nolock
_putch
_putch_nolock
_putwch
_putwch_nolock
_ungetch
_ungetch_nolock
_ungetwch
_ungetwch_nolock
_kbhit
kbhit
putch
cgets
cprintf
cputs
cscanf
cwait
getch
getche
ungetch
|
这些控制台 I/O 功能在基于 GUI 的 UWP 应用程序中不可用。 | UWP 控制台应用可以使用这些功能。 有关详细信息,请参阅 创建通用 Windows 平台控制台应用程序。 |
getpid
_getpid
|
这些函数已过时。 | 使用 Win32 API GetCurrentProcessId 。 |
_getdiskfree |
暂无 | 使用 Win32 API GetDiskFreeSpaceExW 。 |
_getdrive
_getdrives
|
相应的 API 不适用于 UWP 应用。 | 无解决方法。 |
_inp
_inpd
_inpw
_outp
_outpd
_outpw
inp
inpd
inpw
outp
outpd
outpw
|
UWP 应用程序不支持端口 IO。 | 无解决方法。 |
_ismbcalnum
_ismbcalnum_l
_ismbcalpha
_ismbcalpha_l
_ismbcdigit
_ismbcdigit_l
_ismbcgraph
_ismbcgraph_l
_ismbchira
_ismbchira_l
_ismbckata
_ismbckata_l
_ismbcl0
_ismbcl0_l
_ismbcl1
_ismbcl1_l
_ismbcl2
_ismbcl2_l
_ismbclegal
_ismbclegal_l
_ismbclower
_ismbclower_l
_ismbcprint
_ismbcprint_l
_ismbcpunct
_ismbcpunct_l
_ismbcspace
_ismbcspace_l
_ismbcsymbol
_ismbcsymbol_l
_ismbcupper
_ismbcupper_l
_mbbtombc
_mbbtombc_l
_mbbtype
_mbbtype_l
_mbccpy
_mbccpy_l
_mbccpy_s
_mbccpy_s_l
_mbcjistojms
_mbcjistojms_l
_mbcjmstojis
_mbcjmstojis_l
_mbclen
_mbclen_l
_mbctohira
_mbctohira_l
_mbctokata
_mbctokata_l
_mbctolower
_mbctolower_l
_mbctombb
_mbctombb_l
_mbctoupper
_mbctoupper_l
_mbsbtype
_mbsbtype_l
_mbscat
_mbscat_l
_mbscat_s
_mbscat_s_l
_mbschr
_mbschr_l
_mbscmp
_mbscmp_l
_mbscoll
_mbscoll_l
_mbscpy
_mbscpy_l
_mbscpy_s
_mbscpy_s_l
_mbscspn
_mbscspn_l
_mbsdec
_mbsdec_l
_mbsicmp
_mbsicmp_l
_mbsicoll
_mbsicoll_l
_mbsinc
_mbsinc_l
_mbslen
_mbslen_l
_mbslwr
_mbslwr_l
_mbslwr_s
_mbslwr_s_l
_mbsnbcat
_mbsnbcat_l
_mbsnbcat_s
_mbsnbcat_s_l
_mbsnbcmp
_mbsnbcmp_l
_mbsnbcnt
_mbsnbcnt_l
_mbsnbcoll
_mbsnbcoll_l
_mbsnbcpy
_mbsnbcpy_l
_mbsnbcpy_s
_mbsnbcpy_s_l
_mbsnbicmp
_mbsnbicmp_l
_mbsnbicoll
_mbsnbicoll_l
_mbsnbset
_mbsnbset_l
_mbsnbset_s
_mbsnbset_s_l
_mbsncat
_mbsncat_l
_mbsncat_s
_mbsncat_s_l
_mbsnccnt
_mbsnccnt_l
_mbsncmp
_mbsncmp_l
_mbsncoll
_mbsncoll_l
_mbsncpy
_mbsncpy_l
_mbsncpy_s
_mbsncpy_s_l
_mbsnextc
_mbsnextc_l
_mbsnicmp
_mbsnicmp_l
_mbsnicoll
_mbsnicoll_l
_mbsninc
_mbsninc_l
_mbsnlen
_mbsnlen_l
_mbsnset
_mbsnset_l
_mbsnset_s
_mbsnset_s_l
_mbspbrk
_mbspbrk_l
_mbsrchr
_mbsrchr_l
_mbsrev
_mbsrev_l
_mbsset
_mbsset_l
_mbsset_s
_mbsset_s_l
_mbsspn
_mbsspn_l
_mbsspnp
_mbsspnp_l
_mbsstr
_mbsstr_l
_mbstok
_mbstok_l
_mbstok_s
_mbstok_s_l
_mbsupr
_mbsupr_l
_mbsupr_s
_mbsupr_s_l
is_wctype
|
UWP 应用不支持多字节字符串。 | 请改用 Unicode 字符串。 |
_pclose
_pipe
_popen
_wpopen
|
管道功能不适用于 UWP 应用。 | 无解决方法。 |
_resetstkoflw |
支持 Win32 API 不适用于 UWP 应用。 | 无解决方法。 |
_getsystime
_setsystime
|
这些是以前 CRT 版本中过时的 API。 此外,由于缺少权限,用户无法在 UWP 应用程序中设置系统时间。 | 要仅获取系统时间,请使用 Win32 API GetSystemTime 。 无法设置系统时间。 |
_environ
_putenv
_putenv_s
_searchenv
_searchenv_s
_dupenv_s
_wputenv
_wputenv_s
_wsearchenv getenv getenv_s putenv _wdupenv_s _wenviron _wgetenv _wgetenv_s _wsearchenv_s tzset |
环境变量不可用于 UWP 应用。 | 无解决方法。 要设置时区,请使用 _tzset . |
_loaddll
_getdllprocaddr
_unloaddll
|
这些是以前 CRT 版本中过时的函数。 此外,用户无法加载除同一应用程序包中的 DLL 之外的 DLL。 | 使用 Win32 API LoadPackagedLibrary 、 GetProcAddress 和 FreeLibrary 加载和使用打包的 DLL。 |
_wexecl
_wexecle
_wexeclp
_wexeclpe
_wexecv
_wexecve
_wexecvp
_wexecvpe
_execl
_execle
_execlp
_execlpe
_execv
_execve
_execvp
_execvpe
_spawnl
_spawnle
_spawnlp
_spawnlpe
_spawnv
_spawnve
_spawnvp
_spawnvpe
_wspawnl
_wspawnle
_wspawnlp
_wspawnlpe
_wspawnv
_wspawnve
_wspawnvp
_wspawnvpe
_wsystem
execl
execle
execlp
execlpe
execv
execve
execvp
execvpe
spawnl
spawnle
spawnlp
spawnlpe
spawnv
spawnve
spawnvp
spawnvpe
system
|
该功能在 UWP 应用程序中不可用。 UWP 应用无法调用其他 UWP 应用或桌面应用。 | 无解决方法。 |
_heapwalk
_heapadd
_heapchk
_heapset
_heapused
|
这些函数通常用于处理堆。 但是,UWP 应用程序不支持相应的 Win32 API。 而且,应用程序无法再创建或使用私有堆。 | 无解决方法。 但是, _heapwalk 在 DEBUG CRT 中可用,仅用于调试目的。 这些功能不能在上传到 Microsoft Store 的应用程序中使用。 |
以下函数在 UWP 应用的 CRT 中可用。 但是,仅当无法使用相应的 Win32 或 Windows 运行时 API 时(例如,在移植大型代码库时),才使用它们:
功能 | 解决方法 |
---|---|
单字节字符串函数 — 例如 strcat 、 strcpy strlwr 等。 |
使 UWP 应用严格使用 Unicode,因为公开的所有 Win32 API 和 Windows 运行时 API 仅使用 Unicode 字符集。 留下单字节函数用于移植大型代码库,但应避免使用。 应尽可能改用相应的宽 char 函数。 |
流式 IO 和低级文件 IO 函数 — 例如 、 fopen 、 open 等。 |
这些函数是同步的,不建议用于 UWP 应用。 在 UWP 应用中,使用异步 API 打开、读取和写入文件,以防止 UI 线程锁定。 此类 API 的示例是类中的 Windows::Storage::FileIO API。 |
Windows 8.x 应用商店应用程序和 Windows Phone 8.x 应用程序
前面提到的 API 和以下 API 在 Windows 8.x 应用商店应用程序和 Windows Phone 8.x 应用程序中均不可用。
功能 | DESCRIPTION | 解决方法 |
---|---|---|
_beginthread
_beginthreadex
_endthread
_endthreadex
|
线程 Win32 API 在 Windows 8.x 应用商店应用程序中不可用。 |
Windows Runtime Windows::System::Threading::ThreadPool 请改用 orconcurrency::task 。 |
_chdir
_wchdir
_getcwd
_getdcwd
_wgetcwd
_wgetdcwd
|
工作目录的概念不适用于 Windows 8.x 应用商店应用程序。 | 请改用完整路径。 |
_isleadbyte_l
_ismbbalnum 、 _ismbbalnum_l 、 、 _ismbbalpha 、 _ismbbalpha _ismbbalpha_l _ismbbgraph _ismbbgraph_l _ismbbkalnum _ismbbkalnum_l _ismbbkana _ismbbkana_l _ismbbkprint _ismbbkprint_l _ismbbkpunct _ismbbkpunct_l _ismbblead _ismbblead_l _ismbbprint _ismbbprint_l _ismbbpunct _ismbbpunct_l _ismbbtrail _ismbbtrail_l _ismbslead _ismbslead_l _ismbstrail _ismbstrail_l _mbsdup isleadbyte |
Windows 8.x 应用商店应用程序不支持多字节字符串。 | 请改用 Unicode 字符串。 |
_tzset |
环境变量不适用于 Windows 8.x 应用商店应用程序。 | 无解决方法。 |
_get_heap_handle 、_heapmin |
Windows 8.x 应用商店应用程序不支持相应的 Win32 API。 而且,应用程序无法再创建私有堆。 | 无解决方法。 但是, _get_heap_handle 在 DEBUG CRT 中可用,仅用于调试目的。 |