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

C++导出进程数统计DLL至C#后调用显示异常求助

解决C#调用C++ DLL获取进程数时标签显示异常的问题

咱们一步步拆解问题,先解决最明显的错误,再排查潜在的隐患:

1. 直接导致标签显示异常的代码错误

看你C#代码里的按钮点击事件:

int s = size();
Hllolbl.Text = Convert.ToString("s");

这里你把**字符串字面量"s"**传给了Convert.ToString(),而不是变量s的值!所以不管DLL返回的进程数是多少,标签都会固定显示"s"。

修正成这样就可以正确显示进程数了:

private void click_Click(object sender, EventArgs e)
{
    try
    {
        int processCount = size();
        // 用变量processCount而不是字符串"processCount"
        Hllolbl.Text = processCount.ToString();
    }
    catch (Exception ex)
    {
        // 加个异常捕获,方便排查DLL加载或调用失败的问题
        Hllolbl.Text = $"错误:{ex.Message}";
    }
}

2. 排查C++ DLL的潜在问题

你的DLL代码还有几个需要完善的地方,否则可能导致返回值不正确或者调用失败:

  • 链接PSAPI库:EnumProcesses属于PSAPI函数,需要在C++代码里显式链接psapi.lib,否则编译或运行时可能找不到这个函数。在dllmain.cpp开头加上:
    #pragma comment(lib, "psapi.lib")
    
  • 正确导出函数:虽然你在头文件里声明了extern "C" __declspec(dllexport),但实现部分最好也保持一致,避免名字修饰导致C#找不到函数。修改size()的实现:
    extern "C" __declspec(dllexport) int size() {
        // 原代码逻辑...
    }
    
  • 错误处理:当前代码没有检查EnumProcesses的返回值,如果函数调用失败(比如权限不足),会返回错误的进程数。可以加个判断:
    if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
    {
        return -1; // 返回-1表示调用失败,C#那边可以据此判断
    }
    

3. 其他需要注意的点

  • 权限问题:枚举系统进程需要一定权限,如果你的C#程序没有管理员权限,可能无法枚举所有进程,导致返回的数量不准确。可以尝试右键以管理员身份运行程序。
  • DLL路径问题:你用了绝对路径"D://source//repos//Dll1//Debug//Dll1.dll",如果后续DLL位置变动,会导致加载失败。建议把DLL复制到C#程序的输出目录(比如bin/Debug),然后用DllImport("Dll1.dll")加载。

按照上面的步骤修改后,应该就能正常显示进程总数了。

内容的提问来源于stack exchange,提问作者user7220753

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:03:45