首页 > 解决方案 > Visual Studio C++/CLR - (Mutex) 无法将参数 3 从 'bool *' 转换为 'bool %'

问题描述

我尝试在 clr Mutex 中使用地址操作,因为我正在使用 winforms 进行开发,我无法真正理解 % 运算符在布尔变量的声明中使用了什么。Mutex(bool initiallyOwned, Syste::String ^name, bool %createdNew)这是我正在使用的互斥锁函数的原型。由于参数的第三部分,我无法让它与我的实现一起使用。

 bool createdNew = true;
    System::Threading::Mutex^ mutex = gcnew System::Threading::Mutex(true, "MyApplicationName", &createdNew);
    if (createdNew){
        MessageBox::Show("First Instance");
        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false);
        Application::Run(gcnew ProjectMod::loginForm());
    }else{
        System::Diagnostics::Process^ current = System::Diagnostics::Process::GetCurrentProcess();
        for each (System::Diagnostics::Process ^ process in System::Diagnostics::Process::GetProcessesByName(current->ProcessName))
            if (process->Id != current->Id){
                if (IsIconic((HWND)process->MainWindowHandle.ToPointer()))
                    ShowWindow((HWND)process->MainWindowHandle.ToPointer(), SW_RESTORE);
                SetForegroundWindow((HWND)process->MainWindowHandle.ToPointer());
                break;
            }
    }

有人可以请帮助我应该如何更具体地调用 Mutex 函数如何处理第三个参数。

标签: c++-cli

解决方案


您不需要&“地址”运算符将 abool转换为 a bool%

bool createdNew;
Mutex^ mutex = gcnew Mutex(true, "MyApplicationName", createdNew);
// Remove the ampersand ------------------ right here ^

其他注意事项:

  • 如果你不局限于检查,事情会更好createdNew。如果它不是新创建的,您还需要尝试锁定它。
  • 如果你释放 Mutex,事情会更好,而不是仅仅关闭对它的引用并让它被删除。您可以通过在调用 toReleaseMutex之后坚持调用 to 来做到这一点Application::Run
  • 您应该选择一个比“MyApplicaitonName”更独特的名称。生成一个 Guid,敲击键盘,类似的东西。

推荐阅读