【发布时间】:2013-03-04 14:24:42
【问题描述】:
我正在编写代码来检查是否安装了我的虚拟打印机,为此我使用 EnumMonitors winapi,代码编译,但是当我尝试运行我的程序时,它崩溃了。
调试我的程序时,我在这一行遇到了 Segmentation fault 错误:EnumMonitors(NULL, 0, (LPBYTE)buffer, sizeof(buffer), &capacity, &returned);
在 .pro 文件中我添加了LIBS += "C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\WinSpool.Lib"
我可以做些什么来使 EnumMonitors WinAPI 工作?
我的代码:
#include <windows.h>
#include <winspool.h>
void Enum()
{
char buffer[4096];
DWORD capacity;
DWORD returned;
QString monitorname = "Redirected Port";
/*Program crashes here*/ EnumMonitors(NULL, 1, (LPBYTE)buffer, sizeof(buffer), &capacity, &returned);
MONITOR_INFO_1 *mi = (MONITOR_INFO_1*)buffer;
for (uint i = 0; i < returned; i++)
{
if (QString::fromWCharArray(mi[i].pName) == monitorname)
{
//Do something
}
}
}
编辑:我已将我的代码从 0 更新为 1 作为第二个参数
【问题讨论】:
-
您是否有意不按照有关如何使用
EnumMonitors的说明进行操作? (即,将 0 传递给Level,而不是在最初将cbBuf设置为 0 以确定所需的缓冲区大小时调用它) -
调用一次以确定所需的大小是可选的,不是必需的。但是,是的,级别确实需要正确设置。
-
您可能希望将
capacity和returned的初始值设置为0。没有不确定的值总是一件好事。
标签: c++ qt winapi segmentation-fault