• 10152阅读
  • 8回复

Qt 中怎么保证应用程序只启动一个实例 [复制链接]

上一主题 下一主题
离线fanbinnet
 

只看楼主 倒序阅读 楼主  发表于: 2007-08-14
— 本帖被 XChinux 执行加亮操作(2007-08-14) —
    HANDLE hMutex;
        unsigned char uchErrorMsg[300];

    if((hMutex=CreateMutex(NULL,true,"['{EFEB2EF6-F8E0-AE44-BABE-1BBEF2C7FD56}']"))==0);// return 1;
    if(GetLastError()==ERROR_ALREADY_EXISTS)
    {
            CloseHandle(hMutex);
            Application->MessageBox("应用程序已经运行!","错误",MB_OK);
            return 0;
    }


我在C++Builder 中这么使用,不知道QT中用什么方法
[ 此贴被XChinux在2007-08-14 17:27重新编辑 ]
离线XChinux

只看该作者 1楼 发表于: 2007-08-14
只要用的是纯Win32 API,没有用到BCB中的专有API,就也可以在QT中使用。

#include <QtGui/QApplication>
#include <QtGui/QMessageBox>
#include <QtGui/QWidget>
#ifdef Q_WS_WIN
#include <windows.h>
#endif

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

#ifdef Q_WS_WIN
    HANDLE hMutex = CreateMutex(NULL, true, QString("['{EFEB2EF6-F8E0-AE44-BABE-1BBEF2C7FD56}']").toStdWString().c_str());
    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
        CloseHandle(hMutex);
        QMessageBox::information(NULL, "Info", "Has been Run", "OK");
        app.exit(1);
        return 1;
    }
#endif

    QWidget form;
    form.setWindowTitle("Hello");
    form.resize(400, 300);
    form.show();
    return app.exec();
}
[ 此贴被XChinux在2007-08-14 17:26重新编辑 ]
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线fanbinnet

只看该作者 2楼 发表于: 2007-08-14
这样的程序跨平台有问题吗?
离线fanbinnet

只看该作者 3楼 发表于: 2007-08-14
QApplication::sessionId () const
好像可以解决我的问题,还是谢谢站长了。
离线thetwo
只看该作者 4楼 发表于: 2008-06-10
不知道3楼的这个函数怎么用才能达到只启动一个程序实例的效果呢?

虽然是去年的帖子了,还是翻出来请各位指教一下。
离线sunday1118
只看该作者 5楼 发表于: 2010-02-02
站长回帖 不同凡响
呵呵 代码很好用啊
离线hehui

只看该作者 6楼 发表于: 2010-03-02
QLocalSocket~~~~~~~~也可以拿来用用~
离线aoxuehan

只看该作者 7楼 发表于: 2010-03-04
顶一下。虽然有点儿老了。
老大的代码很管用啊!

这个真的很实用!
常梦想自己是地主家的少爷
整天游手好闲,不学无术
没事儿带着一帮狗奴才在大街上调戏良家妇女。
离线retaw
只看该作者 8楼 发表于: 2010-05-10
那一楼的回复是QT的用法吗??纯windows api,源自《windows 核心编程》的东西,能跨平台吗?
快速回复
限100 字节
 
上一个 下一个