吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 472|回复: 3
收起左侧

[求助] 求助以MFC为例子写个只运行一个实例代码

[复制链接]
朱朱你堕落了 发表于 2024-7-31 14:41
66吾爱币
写在哪个位置,如何写,麻烦把代码发一下,就是只运行一个。用MFC为例子。

比方说,先运行,OK,打开了。再双击运行一下,没有任意提示,就直接退出。

最佳答案

查看完整内容

[mw_shl_code=cpp,true]BOOL CtestMutexApp::InitInstance() { // 如果一个运行在 Windows XP 上的应用程序清单指定要 // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, //则需要 InitCommonControlsEx()。 否则,将无法创建窗口。 INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); // 将它设置为包括所有要在应用程序中使用的 ...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

yes2 发表于 2024-7-31 14:42
本帖最后由 yes2 于 2024-7-31 15:00 编辑

[C++] 纯文本查看 复制代码
BOOL CtestMutexApp::InitInstance()
{
        // 如果一个运行在 Windows XP 上的应用程序清单指定要
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
        //则需要 InitCommonControlsEx()。  否则,将无法创建窗口。
        INITCOMMONCONTROLSEX InitCtrls;
        InitCtrls.dwSize = sizeof(InitCtrls);
        // 将它设置为包括所有要在应用程序中使用的
        // 公共控件类。
        InitCtrls.dwICC = ICC_WIN95_CLASSES;
        InitCommonControlsEx(&InitCtrls);

        CWinApp::InitInstance();
    HANDLE hObject = CreateMutex(NULL, FALSE, _T("__SINGLE_PROCESS"));  // 创建命名互斥量
    if (GetLastError() == ERROR_ALREADY_EXISTS)                                               // 失败退出
    {
        CloseHandle(hObject);
        // AfxMessageBox(_T("程序已经运行!"));
        return FALSE;
    }

        AfxEnableControlContainer();

        // 创建 shell 管理器,以防对话框包含
        // 任何 shell 树视图控件或 shell 列表视图控件。
        CShellManager *pShellManager = new CShellManager;

        // 激活“Windows Native”视觉管理器,以便在 MFC 控件中启用主题
        CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));

        // 标准初始化
        // 如果未使用这些功能并希望减小
        // 最终可执行文件的大小,则应移除下列
        // 不需要的特定初始化例程
        // 更改用于存储设置的注册表项
        // TODO:  应适当修改该字符串,
        // 例如修改为公司或组织名
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

        CtestMutexDlg dlg;
        m_pMainWnd = &dlg;
        INT_PTR nResponse = dlg.DoModal();
        if (nResponse == IDOK)
        {
                // TODO:  在此放置处理何时用
                //  “确定”来关闭对话框的代码
        }
        else if (nResponse == IDCANCEL)
        {
                // TODO:  在此放置处理何时用
                //  “取消”来关闭对话框的代码
        }
        else if (nResponse == -1)
        {
                TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");
                TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");
        }

        // 删除上面创建的 shell 管理器。
        if (pShellManager != NULL)
        {
                delete pShellManager;
        }
    CloseHandle(hObject);                                                                              // 关闭互斥量句柄。不关也不影响,退出进程会自动回收
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
        //  而不是启动应用程序的消息泵。
        return FALSE;
}


MFC对话框程序。互斥代码不是一定要放在这里,比如CtestMutexDlg::OnInitDialog应该也是可以的,只要在界面显示出来之前判断并退出就可以

点评

只要这几行就行了吗? HANDLE hObject = CreateMutex(NULL, FALSE, _T("__SINGLE_PROCESS")); // 创建命名互斥量 if (GetLastError() == ERROR_ALREADY_EXISTS)  详情 回复 发表于 2024-7-31 15:02
 楼主| 朱朱你堕落了 发表于 2024-7-31 15:02
yes2 发表于 2024-7-31 14:56
[mw_shl_code=cpp,true]BOOL CtestMutexApp::InitInstance()
{
        // 如果一个运行在 Windows XP 上 ...

只要这几行就行了吗?

    HANDLE hObject = CreateMutex(NULL, FALSE, _T("__SINGLE_PROCESS"));  // 创建命名互斥量
    if (GetLastError() == ERROR_ALREADY_EXISTS)                                               // 失败退出
    {
        CloseHandle(hObject);
        return FALSE;
    }
yes2 发表于 2024-7-31 15:24
朱朱你堕落了 发表于 2024-7-31 15:02
只要这几行就行了吗?

    HANDLE hObject = CreateMutex(NULL, FALSE, _T("__SINGLE_PROCESS"));  // ...

是的。
在退出之前还有一句CloseHandle(hObject); 但是不写也没关系
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-28 07:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表