You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:11:18