Jar*_*Par 10

我认为你需要在前进之前考虑一下你的情景.不止一次对"运行相同程序"有许多不同的解释.比如你呢?

  1. 每台机器一次
  2. 每次登录会话一次
  3. 每个用户一次

所有这些都有不同的,虽然相似的解决方案.

最容易描述的是每台机器.在这种情况下,您想要创建一个名为Mutex.一个启动每个程序必须获得这个互斥锁,如果它们成功,它们会在进程生命周期内运行并持有互斥锁.否则其他一些程序正在运行并立即退出.

不幸的是,这种方法也有其缺点.如果我想弄乱你的程序,我可以创建一个具有相同名称的互斥锁.这将阻止您的程序运行任何实例,因为他们无法分辨谁拥有互斥锁,只是某些东西持有互斥锁.

  • 关于"敌对的互斥体",如果你不写作,那么你真的需要关心的是Word吗? (2认同)
  • @Rex M,这是作者必须回答的问题.我会在这里冒险"不".但是在编写程序时应该考虑这个问题.如果没有别的,除了你不小心自己做的机会. (2认同)

Rob*_*obS 9

您可以在应用程序的第一个实例启动时创建互斥锁.要防止第二个实例,您需要做的就是检查是否正在使用互斥锁.

其实有提出了使用互斥用于此目的的问题在这里看看JaredPar的答案.

注意:如果您希望"一个实例"仅应用于用户的会话(而不是所有用户),则可以使用本地互斥锁


Jor*_*ane 8

如果是您的程序,则Windows下可能是最短的版本:

int main(int argc, char** argv)
{
    CreateMutexA(0, FALSE, "Local\\$myprogram$"); // try to create a named mutex
    if(GetLastError() == ERROR_ALREADY_EXISTS) // did the mutex already exist?
        return -1; // quit; mutex is released automatically

    // ... program code ...
}
Run Code Online (Sandbox Code Playgroud)

如果您需要的只是简单的检查,就不必发疯了……

  • @buzz3791再读一遍手册:“使用CloseHandle函数关闭句柄。当进程终止时系统会自动关闭句柄。当最后一个句柄被关闭时,互斥对象将被销毁。” (2认同)

Pab*_*ruz -1

您可以检查窗口类是否已经注册。看看这个MSDN 条目。