DllImport引入的kernel32代码控制台正常 UWP中FindFirstFileW返回无效句柄
根因说明
- 配置
broadFileSystemAccess受限权限时未声明对应命名空间,导致清单文件报格式错误 - UWP默认运行在隔离沙箱中,没有全局文件系统访问权限,直接调用Win32文件API会被系统拒绝。而桌面控制台应用运行在普通用户权限上下文,默认拥有当前用户的全部文件访问权限,所以相同逻辑可以正常运行。
broadFileSystemAccess权限最低要求Windows 10 1803版本,刚好匹配你的应用目标版本,无需调整版本兼容配置。
解决步骤
1. 修复清单文件权限配置
打开项目中的Package.appxmanifest文件,选择用XML编辑器打开,修改根节点<Package>的属性,添加rescap命名空间声明,同时将rescap加入可忽略命名空间列表,示例如下:
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap rescap">
之后在<Capabilities>节点下添加权限声明:
<Capabilities> <!-- 其他已声明的权限保留 --> <rescap:Capability Name="broadFileSystemAccess" /> </Capabilities>
重新编译项目,原有的命名空间警告会消失。
2. 开启应用文件访问权限
应用部署到本地后,进入系统设置 > 隐私和安全性 > 文件系统,找到你的应用,确认它的文件系统访问权限已开启。
3. 路径格式优化(可选但推荐)
原生Win32 API对路径格式要求更严格,你当前代码默认的输入路径是C:/(正斜杠格式),可能导致API识别异常,建议在拼接查询字符串前统一格式化路径:
在RecursiveScan2方法开头添加如下代码:
directory = directory.Replace('/', '\\').TrimEnd('\\') + "\\";
处理后拼接的查询路径lpFileName = directory + "*"会是标准的C:\\*格式,避免格式问题导致的调用失败。
验证方法
你可以先用UWP自带接口Windows.Storage.ApplicationData.Current.LocalFolder.Path获取应用本地数据目录作为参数测试,该路径UWP默认拥有访问权限,如果可以正常返回扫描结果,说明你的API封装逻辑没有问题,配置权限后即可正常扫描任意路径。
内容的提问来源于stack exchange,提问作者Adrian K
相关产品推荐
相关产品推荐

