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
相关产品推荐
相关产品推荐

