Win32 - 一些 Win32 API 函数的接口
Win32 模块包含用于访问 Win32 API 的函数。
建议在使用任何这些函数之前use Win32;
;但是,为了向后兼容,标记为 [CORE] 的函数将自动为您执行此操作。
在下面的函数说明中,术语Unicode 字符串用于表示字符串可能包含系统代码页之外的字符。注意事项如果核心 Perl 版本支持通常表示 Perl 5.8.9 及更高版本,尽管一些 Unicode 路径名功能可能在早期版本上运行。
中止在指定的 MACHINE 上的系统关机(由 InitiateSystemShutdown 函数启动)。
[CORE] 返回 ActivePerl 构建号。此函数仅在 ActivePerl 二进制发行版中可用。
[核心] Win32::CopyFile() 函数将一个现有文件复制到一个新文件中。所有文件信息,如创建时间和文件属性,都将复制到新文件中。但是,它不会复制安全信息。如果目标文件已存在,则仅当 OVERWRITE 参数为 true 时才会覆盖它。但即使这样,也不会覆盖只读文件;您必须先自己取消链接(unlink())。
创建 DIRECTORY,并在成功时返回一个 true 值。如果失败,请查看 $^E 以获取扩展错误信息。
DIRECTORY 可能包含系统代码页之外的 Unicode 字符。创建目录后,可以使用 Win32::GetANSIPathName() 获取一个可以传递给系统调用和外部程序的名称。
创建 FILE,并在成功时返回一个 true 值。如果失败,请查看 $^E 以获取扩展错误信息。
FILE 可能包含系统代码页之外的 Unicode 字符。创建文件后,可以使用 Win32::GetANSIPathName() 获取一个可以传递给系统调用和外部程序的名称。
[核心] 返回当前 perl 进程所有者登录的 Microsoft 网络域或工作组的名称。“工作站”服务必须正在运行才能确定此信息。此函数不适用于 Windows 9x。
获取 STRING 并用其定义的值替换所有引用的环境变量名称。对环境变量的引用采用以下形式:%VariableName%
。在环境中查找 VariableName 时,忽略大小写。如果找不到该变量,则保留原始的 %VariableName%
文本。具有与以下内容相同的效果
$string =~ s/%([^%]*)%/$ENV{$1} || "%$1%"/eg
但是,如果通过 %ENV 未分配要展开的环境变量,则此函数可能会返回一个 Unicode 字符串。对 %ENV 的访问目前始终使用字节语义。
[核心] 将提供的 Win32 错误号(例如由 Win32::GetLastError() 返回)转换为描述性字符串。类似于 perror() 标准 C 库函数。请注意,在字符串上下文中使用的 $^E
具有大致相同的效果。
C:\> perl -e "$^E = 26; print $^E;"
The specified disk or diskette cannot be accessed
[核心] 返回当前活动驱动器的文件系统名称(如“FAT”或“NTFS”)。在列表上下文中,它返回三个值:(FSTYPE, FLAGS, MAXCOMPLEN)。FSTYPE 是文件系统类型,如前所述。FLAGS 是下表中值的组合
0x00000001 supports case-sensitive filenames
0x00000002 preserves the case of filenames
0x00000004 supports Unicode in filenames
0x00000008 preserves and enforces ACLs
0x00000010 supports file-based compression
0x00000020 supports disk quotas
0x00000040 supports sparse files
0x00000080 supports reparse points
0x00000100 supports remote storage
0x00008000 is a compressed volume (e.g. DoubleSpace)
0x00010000 supports object identifiers
0x00020000 supports the Encrypted File System (EFS)
MAXCOMPLEN 是此文件系统上文件名组件(两个反斜杠之间的部分)的最大长度。
卸载以前加载的动态链接库。此调用后,HANDLE 不再有效。有关动态加载库的信息,请参见 LoadLibrary。
返回操作系统当前的 Windows ANSI 代码页标识符。另请参见 GetOEMCP()、GetConsoleCP() 和 GetConsoleOutputCP()。
返回 FILENAME 的 ANSI 版本。如果系统代码页无法表示长名称,则可能是短名称。
虽然目前尚未实现,但将来此函数有可能仅将 FILENAME 路径的部分内容转换为短格式。
如果 FILENAME 不存在于文件系统中,或者文件系统不支持短 ANSI 文件名,则此函数将使用替换字符将 Unicode 名称转换为系统代码页。
此函数的使用已弃用。它等效于 $ENV{PROCESSOR_ARCHITECTURE}。这可能在 Win9X 上不起作用。
返回处理器类型:x86 处理器的 386、486 或 586,x64 处理器的 8664,Itanium 的 2200。对于 arm/arm64 处理器,该值在 Microsoft 文档中标记为“保留”(未指定,但通常为 0),因此最好使用 GetChipArch()。由于它返回本机处理器类型,因此即使从在 64 位 Windows 上运行的 32 位 Perl 调用,它也会返回 64 位处理器类型。
返回处理器架构:x86 处理器的 0,arm 的 5,Itanium 的 6,x64 的 9,arm64 的 12,未知架构的 0xFFFF。
返回调用进程关联的控制台使用的输入代码页。要设置控制台的输入代码页,请参见 SetConsoleCP()。另请参见 GetConsoleOutputCP()、GetACP() 和 GetOEMCP()。
返回与调用进程关联的控制台使用的输出代码页。要设置控制台的输出代码页,请参阅 SetConsoleOutputCP()。另请参阅 GetConsoleCP()、GetACP() 和 GetOEMCP()。
[CORE] 返回当前活动驱动器和目录。此函数不会返回 UNC 路径,因为 Windows 95 下不支持此类功能所需的功能。
如果核心 Perl 版本支持,此函数将在系统代码页中无法表示长路径名时返回当前目录的 ANSI 路径名。
返回当前进程的进程标识符。在进程终止之前,进程标识符在整个系统中唯一标识该进程。
当前进程标识符通常也可通过预定义的 $$ 变量获得。然而,在 fork() 模拟下,$$ 可能包含一个伪进程标识符,该标识符仅对 Perl kill()、wait() 和 waitpid() 函数有意义。即使从伪进程内部调用,Win32::GetCurrentProcessId() 函数也将始终返回常规 Windows 进程 ID。
返回调用线程的线程标识符。在线程终止之前,线程标识符在整个系统中唯一标识该线程。
从可执行文件或 DLL 的 VERSIONINFO 资源中返回文件版本号。这是一个由四个 16 位数字组成的元组。在列表上下文中,将返回这四个数字。在标量上下文中,它们将连接成一个字符串,并用点分隔。
返回 Windows 特殊文件夹之一的完整路径名。如果文件夹不存在,并且可选的 CREATE 参数为 true,则将创建该文件夹。Win32 模块定义了以下 FOLDER 常量,但仅按需导出
CSIDL_ADMINTOOLS
CSIDL_APPDATA
CSIDL_CDBURN_AREA
CSIDL_COMMON_ADMINTOOLS
CSIDL_COMMON_APPDATA
CSIDL_COMMON_DESKTOPDIRECTORY
CSIDL_COMMON_DOCUMENTS
CSIDL_COMMON_FAVORITES
CSIDL_COMMON_MUSIC
CSIDL_COMMON_PICTURES
CSIDL_COMMON_PROGRAMS
CSIDL_COMMON_STARTMENU
CSIDL_COMMON_STARTUP
CSIDL_COMMON_TEMPLATES
CSIDL_COMMON_VIDEO
CSIDL_COOKIES
CSIDL_DESKTOP
CSIDL_DESKTOPDIRECTORY
CSIDL_FAVORITES
CSIDL_FONTS
CSIDL_HISTORY
CSIDL_INTERNET_CACHE
CSIDL_LOCAL_APPDATA
CSIDL_MYMUSIC
CSIDL_MYPICTURES
CSIDL_MYVIDEO
CSIDL_NETHOOD
CSIDL_PERSONAL
CSIDL_PRINTHOOD
CSIDL_PROFILE
CSIDL_PROGRAMS
CSIDL_PROGRAM_FILES
CSIDL_PROGRAM_FILES_COMMON
CSIDL_RECENT
CSIDL_RESOURCES
CSIDL_RESOURCES_LOCALIZED
CSIDL_SENDTO
CSIDL_STARTMENU
CSIDL_STARTUP
CSIDL_SYSTEM
CSIDL_TEMPLATES
CSIDL_WINDOWS
请注意,并非所有文件夹都在所有版本的 Windows 中都定义。
请参阅 CSIDL 常量的 MSDN 文档,目前可在以下位置获得
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/enums/csidl.asp
如果系统代码页中无法表示长名称,此函数将返回 ANSI 文件夹路径。如果您想要文件夹名称的 Unicode 版本,请对 Win32::GetFolderPath() 的结果使用 Win32::GetLongPathName()。
[核心] GetFullPathName 将 FILENAME 与当前驱动器和目录名称结合,并返回一个完全限定(又称绝对)路径名称。在列表上下文中,它返回两个元素:(PATH, FILE),其中 PATH 是完整的路径名组件(包括尾随反斜杠),而 FILE 只是文件名部分。请注意,不会尝试将提供的 FILENAME 中的 8.3 组件转换为长名称或反之亦然。与 Win32::GetShortPathName() 和 Win32::GetLongPathName() 进行比较。
如果核心 Perl 版本支持,则当无法在系统代码页中表示完整路径名时,此函数将返回一个 ANSI 路径名。
[核心] 返回对 Win32 API 函数的调用生成的最后一个错误值。请注意,在数字上下文中使用的 $^E
等于相同的值。
[核心] 返回由长名称组件(如果有)组成的 PATHNAME 的表示形式。结果不一定比 PATHNAME 长。不会尝试将 PATHNAME 转换为绝对路径。与 Win32::GetShortPathName() 和 Win32::GetFullPathName() 进行比较。
如果无法在系统代码页中表示路径名,此函数可能会以 Unicode 返回路径名。在将路径传递给系统调用或其他程序之前,请使用 Win32::GetANSIPathName()。
[核心] 以 "<d>:" 的形式返回一个字符串,其中 <d> 是第一个可用的驱动器盘符。
返回操作系统当前的原始设备制造商 (OEM) 代码页标识符。另请参见 GetACP()、GetConsoleCP() 和 GetConsoleOutputCP()。
返回正在使用的 Windows 操作系统版本的“营销”名称。它返回以下名称(随机样本)
Windows 2000 Datacenter Server
Windows XP Professional
Windows XP Tablet PC Edition
Windows Home Server
Windows Server 2003 Enterprise Edition for Itanium-based Systems
Windows Vista Ultimate (32-bit)
Windows Small Business Server 2008 R2 (64-bit)
显示名称描述了本机 Windows 版本,因此即使在 32 位 Perl 上,此函数在 64 位 Windows 上运行时也可能会返回“Windows ... (64 位)”名称。
此函数仅应用于向用户显示实际操作系统名称;不应将其用于确定此系统所属的操作系统类别。Win32::GetOSName()、Win32::GetOSVersion、Win32::GetProductInfo() 和 Win32::GetSystemMetrics() 函数提供基本信息来检查某些功能或操作系统发行系列。
在标量上下文中返回正在使用的 Win32 操作系统的名称。在列表上下文中,返回一个包含操作系统名称和已知特定版本(适用于 Win9X 系统)以及已安装的任何服务包的两个元素列表。后者大致相当于 GetOSVersion() 在列表上下文中返回的第一项。
该说明还将包括其他特别版本的标签,如“R2”、“媒体中心”、“平板电脑”或“入门版”。
在 Windows 10/Server 半年频道时代,说明中可能包含相关的 ReleaseId 值,但这仅从内部版本号推断而来,而不是绝对确定的。
当前操作系统名称的可能值为
WinWin32s
Win95
Win98
WinMe
WinNT3.51
WinNT4
Win2000
WinXP/.Net
Win2003
WinHomeSvr
WinVista
Win2008
Win7
Win8
Win8.1
Win10
Win2016
Win2019
WinSAC
此例程只是 GetOSVersion() 的一个简单接口。更具体或要求更高的场景应使用该接口。另一个选择是使用 POSIX::uname(),但后者似乎仅报告操作系统系列名称,而不报告具体操作系统。在标量上下文中,它仅返回 ID。
名称“WinXP/.Net”仅出于历史原因使用,以保持 Win32 模块的向后兼容性。Windows .NET Server 在最终发布前已更名为 Windows 2003 Server,并且使用与 Windows XP 不同的主/次版本号。
类似地,名称“WinWin32s”应为“Win32s”,但出于向后兼容性原因也保持原样。
[CORE] 返回列表 (STRING, MAJOR, MINOR, BUILD, ID),其中元素分别为:操作系统的任意描述性字符串、主版本号、次版本号、内部版本号和指示实际操作系统的数字。对于 ID,Win32s 的值为 0,Windows 9X/Me 的值为 1,Windows NT/2000/XP/2003/Vista/2008/7 的值为 2。在标量上下文中,它仅返回 ID。
当前已知的 ID MAJOR MINOR 和 BUILD 值如下
OS ID MAJOR MINOR BUILD
Win32s 0 - - -
Windows 95 1 4 0 -
Windows 98 1 4 10 -
Windows Me 1 4 90 -
Windows NT 3.51 2 3 51 -
Windows NT 4 2 4 0 -
Windows 2000 2 5 0 -
Windows XP 2 5 1 -
Windows Server 2003 2 5 2 -
Windows Server 2003 R2 2 5 2 -
Windows Home Server 2 5 2 -
Windows Vista 2 6 0 -
Windows Server 2008 2 6 0 -
Windows 7 2 6 1 -
Windows Server 2008 R2 2 6 1 -
Windows 8 2 6 2 -
Windows Server 2012 2 6 2 -
Windows 8.1 2 6 2 -
Windows Server 2012 R2 2 6 2 -
Windows 10 2 10 0 -
Windows Server 2016 2 10 0 14393
Windows Server 2019 2 10 0 17677
在 Windows NT 4 SP6 及更高版本上,此函数返回以下其他值:SPMAJOR、SPMINOR、SUITEMASK、PRODUCTTYPE。
Windows 2003 和 Windows 家庭服务器的版本号相同;必须使用 SUITEMASK 字段来区分它们。
Windows Vista 和 Windows Server 2008 的版本号相同;必须使用 PRODUCTTYPE 字段来区分它们。
Windows 7 和 Windows Server 2008 R2 的版本号相同;必须使用 PRODUCTTYPE 字段来区分它们。
Windows 8 和 Windows Server 2012 的版本号相同;必须使用 PRODUCTTYPE 字段来区分它们。
对于现代 Windows 版本,主版本号和次版本号相同。必须使用 PRODUCTTYPE 字段来区分 Windows 10 和服务器版本。BUILD 字段用于区分 Windows Server 版本:当前为 2016、2019 和半年频道版本。
SPMAJOR 和 SPMINOR 是最新安装的服务包的版本号。(在 Windows 10 时代,这些版本号未使用。)
SUITEMASK 是一个位域,用于标识系统上可用的产品套件。已知位有
VER_SUITE_SMALLBUSINESS 0x00000001
VER_SUITE_ENTERPRISE 0x00000002
VER_SUITE_BACKOFFICE 0x00000004
VER_SUITE_COMMUNICATIONS 0x00000008
VER_SUITE_TERMINAL 0x00000010
VER_SUITE_SMALLBUSINESS_RESTRICTED 0x00000020
VER_SUITE_EMBEDDEDNT 0x00000040
VER_SUITE_DATACENTER 0x00000080
VER_SUITE_SINGLEUSERTS 0x00000100
VER_SUITE_PERSONAL 0x00000200
VER_SUITE_BLADE 0x00000400
VER_SUITE_EMBEDDED_RESTRICTED 0x00000800
VER_SUITE_SECURITY_APPLIANCE 0x00001000
VER_SUITE_STORAGE_SERVER 0x00002000
VER_SUITE_COMPUTE_SERVER 0x00004000
VER_SUITE_WH_SERVER 0x00008000
VER_SUITE_MULTIUSERTS 0x00020000
VER_SUITE_xxx 名称在此处列出,以便交叉引用 Microsoft 文档。Win32 模块不为这些常量提供符号名称。
PRODUCTTYPE 提供有关系统的其他信息。它应该是以下整数值之一
1 - Workstation (NT 4, 2000 Pro, XP Home, XP Pro, Vista, etc)
2 - Domaincontroller
3 - Server (2000 Server, Server 2003, Server 2008, etc)
请注意,既是服务器又是域控制器的服务器报告为 PRODUCTTYPE 2(域控制器),而不是 PRODUCTTYPE 3(服务器)。
[CORE] 返回 PATHNAME 的表示形式,该表示形式由短(8.3)路径组件(如果可用)组成。对于文件系统尚未生成短形式的路径组件,返回的路径将使用长形式,因此此函数仍可能返回包含空格的路径。当 PATHNAME 不存在时返回 undef
。与 Win32::GetFullPathName() 和 Win32::GetLongPathName() 进行比较。
检索指定的系统指标或系统配置设置。有关可用 INDEX 值的参考,请参阅 GetSystemMetrics() 函数的 Microsoft 文档。所有系统指标都返回整数值。
返回加载的库中函数的地址。有关如何使用此地址的信息已在时间的迷雾中丢失。使用 Win32::API 模块,而不是此已弃用的函数。
返回对保存指定进程所持有的权限的信息的哈希的引用。键是权限名称,值是布尔值,指示给定的权限当前是否已启用。
如果省略可选的 PID 参数,则该函数会查询当前进程。
示例返回值
{
SeTimeZonePrivilege => 0,
SeShutdownPrivilege => 0,
SeUndockPrivilege => 0,
SeIncreaseWorkingSetPrivilege => 0,
SeChangeNotifyPrivilege => 1
}
检索本地计算机上操作系统的产品类型,并将该类型映射到指定操作系统支持的产品类型。有关参数和返回值的更多信息,请参阅 GetProductInfo() 函数的 Microsoft 文档。此函数需要 Windows Vista 或更高版本。
另请参阅 Win32::GetOSName() 和 Win32::GetOSDisplayName() 函数,它们提供了此函数返回的数据的更高级别的抽象。
[CORE] 返回自上次系统启动以来经过的毫秒数。分辨率受限于系统计时器滴答(在 WinNT 上约为 10 毫秒,在 Win9X 上约为 55 毫秒)。
创建全局唯一的 128 位整数,可在分布式设置中用作持久标识符。此函数在极大程度上返回唯一值。在同一系统或任何其他系统(无论是否联网)上,没有其他调用应返回相同的值。
返回值按照 OLE 约定进行格式化,即带有周围大括号的十六进制数字组。例如
{09531CF1-D0C7-4860-840C-1C8C8735E2AD}
使用 WinHttp 库将 URL 参数指定的文件下载到 FILENAME 指定的本地文件。如果为 true,则可选的第三个参数表示要忽略 https 连接的证书错误;请在安全环境中谨慎使用,例如在使用自签名证书在本地测试时。
仅支持 http 和 https 协议。不支持身份验证。在使用早于 4.8.0 的 gcc 进行构建时,此函数不可用,因为 WinHttp 库不可用。
在标量上下文中返回布尔值成功或失败,在列表上下文中除了布尔状态外,还返回第二个值,其中包含与状态相关的消息文本。
如果调用失败,Win32::GetLastError()
将返回一个数字错误代码,该代码可能是系统错误、WinHttp 错误或由 1e9 加上 HTTP 状态代码组成的用户定义错误。
标量上下文示例
print Win32::GetLastError()
unless Win32::HttpGetFile('http://example.com/somefile.tar.gz',
'.\file.tgz');
列表上下文示例
my ($ok, $msg) = Win32::HttpGetFile('http://example.com/somefile.tar.gz',
'.\file.tgz');
if ($ok) {
print "Success!: $msg\n";
}
else {
print "Failure!: $msg\n";
my $err = Win32::GetLastError();
if ($err > 1e9) {
printf "HTTP status: %d\n", ($err - 1e9);
}
}
(MACHINE, MESSAGE, TIMEOUT, FORCECLOSE, REBOOT)
在指定的 TIMEOUT 时间间隔内关闭指定的 MACHINE,使用提供的 MESSAGE 通知用户。如果 FORCECLOSE 为 true,则强制关闭所有文档,而不提示用户,如果 REBOOT 为 true,则重新启动计算机。此函数仅适用于 WinNT。
如果正在运行当前进程/线程的安全上下文的帐户属于内置系统域中的 Administrators 本地组,则返回非零值;如果不属于,则返回 0。在 Windows Vista 中,只有当进程实际以提升的权限运行时,它才会返回非零值。如果发生错误,则返回 undef
并打印警告。此函数在 Win9X 中始终返回 1。
如果当前启用了开发人员模式,则返回 true。它在低于 Windows 10 的 Windows 版本中始终返回 false。
如果允许当前进程创建符号链接,则返回 true。此函数是 Win32::GetProcessPrivileges() 和 Win32::IsDeveloperModeEnabled() 的便捷包装器。
[CORE] 如果 Win32 子系统是 Windows NT,则返回非零值。
[CORE] 如果 Win32 子系统是 Windows 95,则返回非零值。
将动态链接库加载到内存中并返回其模块句柄。此句柄可与 Win32::GetProcAddress() 和 Win32::FreeLibrary() 一起使用。此函数已弃用。请改用 Win32::API 模块。
[CORE] 返回当前 perl 进程所有者的用户名。返回值可能是 Unicode 字符串。
在 SYSTEM 上查找 ACCOUNT 并返回域名称 SID 和 SID 类型。
在 SYSTEM 上查找 SID 并返回帐户名称、域名称和 SID 类型。
创建一个包含 MESSAGE 的对话框。FLAGS 根据下表指定所需的图标和按钮
0 = OK
1 = OK and Cancel
2 = Abort, Retry, and Ignore
3 = Yes, No and Cancel
4 = Yes and No
5 = Retry and Cancel
MB_ICONSTOP "X" in a red circle
MB_ICONQUESTION question mark in a bubble
MB_ICONEXCLAMATION exclamation mark in a yellow triangle
MB_ICONINFORMATION "i" in a bubble
TITLE 指定可选窗口标题。默认值为“Perl”。
该函数返回所选按钮的菜单 ID
0 Error
1 OK
2 Cancel
3 Abort
4 Retry
5 Ignore
6 Yes
7 No
[CORE] 返回当前计算机的 Microsoft Network 节点名称。
将字符串发送到应用程序或系统调试器以显示。如果没有活动调试器,该函数将不执行任何操作。
或者,可以使用调试查看器应用程序来查看 OutputDebugString() 输出
http://www.microsoft.com/technet/sysinternals/utilities/debugview.mspx
加载 DLL LIBRARYNAME 并调用函数 DllRegisterServer。
[CORE] 设置由 system() 启动的子进程的ShowMode。如果 Perl 本身不是从控制台运行,则 system() 默认情况下会为子进程创建一个新的控制台窗口。调用 SetChildShowWindow(0) 将使这些新的控制台窗口不可见。在没有参数的情况下调用 SetChildShowWindow() 会使 system() 恢复为默认行为。SetChildShowWindow() 的返回值是之前的设置或undef
。
以下 SHOWWINDOW 符号常量可从 Win32 模块获取(但未导出):SW_HIDE、SW_SHOWNORMAL、SW_SHOWMINIMIZED、SW_SHOWMAXIMIZED 和 SW_SHOWNOACTIVATE。
设置与调用进程关联的控制台使用的输入代码页。SetConsoleCP() 的返回值在成功时为非零,在失败时为零。要获取控制台的输入代码页,请参见 GetConsoleCP()。
设置与调用进程关联的控制台使用的输出代码页。SetConsoleOutputCP() 的返回值在成功时为非零,在失败时为零。要获取控制台的输出代码页,请参见 GetConsoleOutputCP()。
[核心] 设置当前活动驱动器和目录。此函数不适用于 UNC 路径,因为 Windows 95 下不提供此类功能所需的功能。
[核心] 将遇到的最后一个错误的值设置为 ERROR。这是 Win32::GetLastError() 函数将返回的值。
[核心] 暂停 TIME 毫秒。将时间片提供给其他进程和线程。
[核心] 使用提供的 COMMAND 生成一个新进程,在字符串 ARGS 中传递参数。新进程的 pid 存储在 PID 中。此函数已弃用。请改用 Win32::Process 模块。
加载 DLL LIBRARYNAME 并调用函数 DllUnregisterServer。
在许多情况下,现代 Windows 系统将不会为长文件名提供 短路径名(也称为 8.3 或 MS-DOS)别名。
可以通过注册表在系统范围内配置短路径支持,但现代系统上的默认设置是按卷配置短路径使用情况。可以通过多种方式查询卷的配置,但这些方式可能不可靠或需要提升的(管理员)权限。
通常,可以使用 fsutil
实用程序查询卷的配置,例如 fsutil 8dot3name query d:
。在 C 级,可以使用 FSCTL_QUERY_PERSISTENT_VOLUME_STATE
请求向 DeviceIOControl
API 调用进行查询,如 本文 所述。但是,这两种方法都需要管理员权限才能工作。
Win32 模块不执行任何按卷检查,并且只以其使用的底层 Windows API 调用相同的方式获取短路径名:如果禁用短路径名,调用仍会成功,但实际上会返回长名称。
请注意,在发生这种情况的卷上,通常无法使用GetANSIPathName
为包含 Unicode 字符的文件返回有用的文件名。(在代码页 65001 中,这可能仍然有效。)以这种旧方式处理 Unicode 文件名依赖于GetShortPathName
返回 8.3 文件名,但如果没有短名称支持,它将返回所有 Unicode 字符都替换为问号字符的文件名。