#include "mainwindow.h" #include <QApplication> #include <windows.h> #include <wtsapi32.h> #include <QLibrary> typedef BOOL(WINAPI *WTSSendMessageFunc)(HANDLE, DWORD, LPWSTR, DWORD, LPWSTR, DWORD, DWORD, LPDWORD, BOOL); int main(int argc, char *argv[]) { QApplication a(argc, argv); // 加载wtsapi32.dll QLibrary lib("wtsapi32.dll"); // 判断是否加载成功 if (!lib.load()) { QMessageBox::warning(NULL, "Warning", QString("Failed to load wtsapi32.dll: %1").arg(lib.errorString())); return 1; } // 获取函数指针 WTSSendMessageFunc WTSSendMessage = (WTSSendMessageFunc)lib.resolve("WTSSendMessageW"); if (WTSSendMessage == NULL) { QMessageBox::warning(NULL, "Warning", QString("Failed to resolve WTSSendMessageW: %1").arg(lib.errorString())); return 1; } // 获取当前会话ID DWORD dwSessionId = WTSGetActiveConsoleSessionId(); if (dwSessionId == 0xFFFFFFFF) { QMessageBox::warning(nullptr, QStringLiteral("错误"), QStringLiteral("获取会话ID失败!")); return -1; } // 获取当前会话令牌 HANDLE hToken = NULL; if (!WTSQueryUserToken(dwSessionId, &hToken)) { QMessageBox::warning(nullptr, QStringLiteral("错误"), QStringLiteral("获取用户令牌失败!")); return -1; } // 创建互斥量,确保程序只能运行一个实例 HANDLE mutex = ::CreateMutex(Q_NULLPTR, true, (LPCWSTR)qApp->applicationName().toStdWString().c_str()); if (!mutex) { QMessageBox::warning(nullptr, QStringLiteral("错误"), QStringLiteral("创建互斥量失败!")); CloseHandle(hToken); return -1; } if (GetLastError() == ERROR_ALREADY_EXISTS) { QMessageBox waringBox(QMessageBox::Warning, QStringLiteral("警告"), QStringLiteral("程序[文本数据同步客户端]只能运行一个!")); waringBox.setButtonText(QMessageBox::Ok, QStringLiteral("确定")); waringBox.setStandardButtons(QMessageBox::Ok); waringBox.exec(); ::CloseHandle(mutex); CloseHandle(hToken); return 0; } // 创建新进程,确保程序在当前会话中运行 STARTUPINFO si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.lpDesktop = (LPWSTR)L"winsta0\\default"; PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi)); if (!CreateProcessAsUser(hToken, NULL, (LPWSTR)qApp->applicationFilePath().toStdWString().data(), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) { QMessageBox::warning(nullptr, QStringLiteral("错误"), QStringLiteral("创建进程失败!")); CloseHandle(mutex); CloseHandle(hToken); return -1; } // 关闭会话令牌和新进程句柄 CloseHandle(hToken); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); // 释放互斥量 ::ReleaseMutex(mutex); // 启动主窗口 MainWindow w; w.show(); return a.exec(); } 在以上代码中会提示:"获取用户令牌失败!",导致无法打开程序,这是什么原因,并给我解决办法
时间: 2024-01-18 10:04:35 浏览: 122
可能是因为缺少管理员权限导致获取用户令牌失败。您可以尝试以下解决办法:
1. 确保以管理员身份运行程序。
2. 在项目的.manifest文件中添加请求管理员权限的属性,以确保程序以管理员身份运行。示例代码如下:
```
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
```
3. 在代码中使用ShellExecute函数打开程序,以确保以管理员身份运行。示例代码如下:
```
QString program = QCoreApplication::applicationFilePath();
QProcess::startDetached("cmd.exe", QStringList() << "/c" << "start" << " " << program);
```
希望以上解决办法能够帮到您。
相关问题
我的代码报错terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc,我写的代码如下:#include "mainwindow.h" #include "ui_mainwindow.h" #include <QtWidgets> #include <QResizeEvent> #include <QDebug> #include <QThread> MainWindow
抱歉,你的代码并没有完整地呈现出来。这个错误通常表示你的程序在运行过程中无法分配足够的内存空间。由于你的程序中有大量的内存分配,这可能是由于你的程序在分配内存时没有正确释放内存所导致的。你需要检查你的程序中是否有大量的内存分配,并且是否有及时释放内存的操作。你可以使用内存分析工具来帮助你找出内存泄漏的原因。在 Qt 中,你可以使用 Qt Creator 中的内存分析器来分析你的程序。此外,你还可以使用第三方工具,如 Valgrind,来分析你的程序中的内存问题。
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
这是一个 C++ Qt 应用程序的主函数。它包括了以下几个步骤:
1. 引入头文件 "mainwindow.h" 和 Qt 应用程序的主头文件 <QApplication>。
2. 定义 main 函数,该函数接受两个参数 argc 和 argv,分别表示命令行参数的数量和值。
3. 创建一个 QApplication 对象 a,用于管理整个 Qt 应用程序的生命周期。
4. 创建一个 MainWindow 对象 w,该对象是一个 GUI 窗口应用程序的主窗口。
5. 调用 w.show() 函数,显示 MainWindow 窗口。
6. 调用 a.exec() 函数,开始 Qt 应用程序的事件循环,等待用户的交互操作。
这段代码的作用是创建一个基于 Qt 框架的 GUI 应用程序,并在用户运行该应用程序时显示一个名为 MainWindow 的主窗口。
阅读全文