Kotlin/Native调用CreateToolhelp32Snapshot无法获取进程无输出求助
问题排查与修复
你的代码没有输出,大概率是Process32First调用失败了,但原代码未针对该情况添加错误提示,导致你无法定位问题。以下是具体的排查和修复方案:
1. 新增错误日志,明确失败原因
在Process32First调用失败后,调用Windows API的GetLastError()获取错误码,以此确定问题根源。修改后的代码如下:
import kotlinx.cinterop.* import platform.windows.* @OptIn(ExperimentalForeignApi::class) fun main() { memScoped { val snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS.toUInt(), 0U) if (snapshot == INVALID_HANDLE_VALUE) { println("Failed to create process snapshot. Error code: ${GetLastError()}") return } val processEntry = alloc<PROCESSENTRY32>() processEntry.dwSize = sizeOf<PROCESSENTRY32>().convert() if (Process32First(snapshot, processEntry.ptr) != 0) { do { val processName = processEntry.szExeFile.toKString() println(processName) } while (Process32Next(snapshot, processEntry.ptr) != 0) } else { // 添加错误提示 println("Process32First failed. Error code: ${GetLastError()}") } CloseHandle(snapshot) } }
2. 常见问题及解决办法
- 错误码299(ERROR_PARTIAL_COPY):若32位程序在64位系统运行,枚举64位进程会触发该错误。解决方式是将项目编译为64位目标,在
build.gradle.kts中添加配置:targetMachines.add(machine(Architecture.X64, OperatingSystem.Windows))。 - dwSize初始化错误:确保
processEntry.dwSize被正确设置为PROCESSENTRY32结构体的大小,原代码的sizeOf<PROCESSENTRY32>().convert()是正确的,但如果结构体绑定异常,可尝试手动指定值:64位系统用568u,32位系统用304u,验证是否为该问题。 - 权限问题:管理员身份运行仍无法枚举部分系统进程是正常情况,但不会导致完全无输出,只会跳过部分进程。
3. 验证项目配置
检查build.gradle.kts是否正确配置Windows目标,确保编译架构与系统匹配,示例配置如下:
plugins { kotlin("multiplatform") version "1.9.20" } kotlin { val windowsTarget = when (System.getProperty("os.arch")) { "amd64" -> mingwX64("windows") else -> mingwX86("windows") } windowsTarget.apply { binaries.executable { entryPoint = "main" } } sourceSets { val windowsMain by getting { dependencies { implementation(kotlin("stdlib")) } } } }
内容的提问来源于stack exchange,提问作者awalol
相关产品推荐
相关产品推荐

