QT LPWSTR LPCWSTR
时间: 2023-11-28 22:33:55 浏览: 148
这是一个IT类问题。QT是一个跨平台的C++图形用户界面应用程序开发框架,LPWSTR和LPCWSTR是Windows编程中的字符串类型。
LPWSTR是一个指向宽字符字符串(Unicode字符串)的指针,它可以用于读写宽字符字符串。
LPCWSTR是一个指向常量宽字符字符串的指针,它用于只读访问宽字符字符串。
相关问题
qt c2664 “char *”转换为“lpcwstr”
c2664是一个编译器错误代码,表示函数调用时参数类型不匹配。在QT中,使用QString类处理字符串,如果需要将QString类型的字符串转换为LPCWSTR类型的字符串,可以使用QString类的toStdWString()成员函数将QString转换为std::wstring类型的字符串,然后使用std::wstring的c_str()函数将其转换为LPCWSTR类型的字符串。代码示例如下:
QString str = "Hello World!";
std::wstring wstr = str.toStdWString();
LPCWSTR lpwstr = wstr.c_str();
注意,LPCWSTR类型是Windows API中定义的一种指向Unicode字符串的指针,因此需要使用Unicode编码的字符串。如果需要将QString类型的字符串转换为Ansi字符串,可以使用QString的toLocal8Bit()成员函数将QString类型的字符串转换为std::string类型的字符串,再使用std::string的c_str()函数将其转换为LPCTSTR类型的字符串。代码示例如下:
QString str = "Hello World!";
std::string s = str.toLocal8Bit().constData();
LPCTSTR lpstr = s.c_str();
需要注意的是,LPCTSTR类型是Windows API中定义的一种指向Ansi字符串或Unicode字符串的指针,具体是哪种字符串由编译时的定义宏决定。如果定义了UNICODE宏,LPCTSTR将被定义为LPCWSTR,指向Unicode字符串;如果未定义UNICODE宏,LPCTSTR将被定义为LPCSTR,指向Ansi字符串。
#include "mainwindow.h" #include <QApplication> #include <windows.h> #include <wtsapi32.h> #pragma comment(lib, "Wtsapi32.lib") int main(int argc, char *argv[]) { QApplication a(argc, argv); HANDLE hToken = NULL; DWORD dwSessionId = WTSGetActiveConsoleSessionId(); if (!WTSQueryUserToken(dwSessionId, &hToken)) { QMessageBox::warning(nullptr, QStringLiteral("错误"), QStringLiteral("获取用户令牌失败!")); return -1; } HANDLE mutex = ::CreateMutex(Q_NULLPTR, true, (LPCWSTR)qApp->applicationName().toStdWString().c_str()); if (GetLastError() == ERROR_ALREADY_EXISTS) { QMessageBox warningBox(QMessageBox::Warning, QStringLiteral("警告"), QStringLiteral("程序[文本数据同步服务端]只能运行一个!")); warningBox.setButtonText(QMessageBox::Ok, QStringLiteral("确定")); warningBox.setStandardButtons(QMessageBox::Ok); warningBox.exec(); ::CloseHandle(mutex); return 0; } else { ::ReleaseMutex(mutex); } 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(hToken); return -1; } CloseHandle(hToken); MainWindow w; w.show(); return a.exec(); } 以上QT C++代码会报出以下错误: D:\QtProject\DataServer\main.cpp:-1: error: undefined reference to `WTSQueryUserToken@8' collect2.exe:-1: error: error: ld returned 1 exit status 请修复后给我完整代码
#include "mainwindow.h"
#include <QApplication>
#include <windows.h>
#include <wtsapi32.h>
#pragma comment(lib, "Wtsapi32.lib")
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
HANDLE hToken = NULL;
DWORD dwSessionId = WTSGetActiveConsoleSessionId();
if (!WTSQueryUserToken(dwSessionId, &hToken)) {
QMessageBox::warning(nullptr, QStringLiteral("错误"), QStringLiteral("获取用户令牌失败!"));
return -1;
}
HANDLE mutex = ::CreateMutex(Q_NULLPTR, true, (LPCWSTR)qApp->applicationName().toStdWString().c_str());
if (GetLastError() == ERROR_ALREADY_EXISTS) {
QMessageBox warningBox(QMessageBox::Warning, QStringLiteral("警告"), QStringLiteral("程序[文本数据同步服务端]只能运行一个!"));
warningBox.setButtonText(QMessageBox::Ok, QStringLiteral("确定"));
warningBox.setStandardButtons(QMessageBox::Ok);
warningBox.exec();
::CloseHandle(mutex);
return 0;
}
else {
::ReleaseMutex(mutex);
}
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(hToken);
return -1;
}
CloseHandle(hToken);
MainWindow w;
w.show();
return a.exec();
}
阅读全文