在 C# 控制台应用程序中检查的 Delphi 应用程序中打开的互斥锁

澳洲联储

我正在启动一个 Delphi 应用程序并为它创建一个互斥锁,如下所示:

var
  AMutex: THandle;

function OpenMutex(const AMutexName: String): Boolean;
begin

  { Assume the Windows Mutext is already open }
  Result := False;

  { Is the Mutex already open? }
  if AMutex <> 0 then
    exit;

  { Try to create Windows Mutex }
  if CreateProgramMutex( AMutexName , AMutex) then
    Result := True
  else
    AMutex := 0;
end;

 function CreateProgramMutex( AMutexName: string; var AMutex: THandle ): boolean;
begin
    { Assume the new program mutex was created successfully. }
    Result := true;

    { Attempt to create a new mutex. }
    AMutex := CreateMutex(nil, False, PChar(AMutexName));

    { If we at least got a handle to the mutex... }
    if (AMutex <> 0) then
    begin

      if GetLastError = ERROR_ALREADY_EXISTS then begin
        { Close the handle, since it already exists. }
        CloseHandle(AMutex);

        { Set the return to show that it was already running. }
        Result := false;
      end;
    end else
      Result := false;
end;

我正在尝试从 C#(作为初学者)找出我的应用程序是否已经在控制台应用程序中运行:

using System;
using System.Threading;

namespace ConsoleApplication1
{
    class OneAtATimePlease
    {
        private static Mutex _mutex;

        private static bool IsSingleInstance()
        {
            _mutex = new Mutex(false, "my mutex name");

            // keep the mutex reference alive until the normal 
            //termination of the program
            GC.KeepAlive(_mutex);

            try
            {
                return _mutex.WaitOne(0, false);
            }
            catch (AbandonedMutexException)
            {
                // if one thread acquires a Mutex object 
                //that another thread has abandoned 
                //by exiting without releasing it

                _mutex.ReleaseMutex();
                return _mutex.WaitOne(0, false);
            }
        }
        static void Main()
        {
            if (!IsSingleInstance())
                Console.WriteLine("already running");
            Console.ReadLine();

        }
    }
}

即使 Delphi 应用程序正在运行,IsSingleInstance 也返回 true。使用相同的 Delphi 代码检查 Delphi 控制台应用程序中的互斥锁。我确信这是显而易见的,但我无法弄清楚我做错了什么。

PS:一切都在同一个 Windows 用户会话下完成

维多利亚

您说您的目标是检查外部应用程序是否正在运行(通过使用命名互斥锁)。好吧,对于这种情况,您不应尝试在应用程序中创建给定名称的互斥对象,而应尝试打开此类对象。原因很简单,如果那个外部应用程序使用这样的互斥锁来检查它是否自己运行,你实际上会为你的应用程序窃取这个互斥锁,而那个外来的应用程序将永远不会启动。

出于您的目的,请使用TryOpenExisting类函数。例如:

using System;
using System.Threading;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Mutex mutex;

            if (Mutex.TryOpenExisting("My unique mutex name", out mutex)) {
                try {
                    // with the used TryOpenExisting overload you can work with
                    // the mutex object here; you can wait for it or release
                    Console.WriteLine("Application is running!");
                }
                finally {
                    mutex.Close();
                }
            }
            else {
                Console.WriteLine("Application is NOT running!");
            }
            Console.ReadLine();
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从C#中的控制台应用程序运行Web应用程序

来自分类Dev

如何使用PeekNamedPipe()从Delphi Code中读取运行控制台应用程序的错误

来自分类Dev

应用程序控制台输出和Delphi中对TMemo的正确编码

来自分类Dev

Delphi控制台应用程序:如何在消息对话框中添加OnHelp?

来自分类Dev

如何使用PeekNamedPipe()从Delphi Code中读取运行控制台应用程序的错误

来自分类Dev

线程不是在Delphi的控制台应用程序中终止吗?

来自分类Dev

如何在.NET 5.0控制台应用程序上的C#中检查Windows版本

来自分类Dev

如果用户在C#程序中打印“ x”,如何使控制台应用程序退出?

来自分类Dev

如何在C#中的控制台应用程序中激活代码的不同部分

来自分类Dev

在C中按“ Ctrl + C”时如何防止控制台应用程序终止?

来自分类Dev

C#托管服务控制台应用程序的运行状况检查

来自分类Dev

在控制台应用程序中捕获ctrl + c事件(多线程)

来自分类Dev

C#很小的控制台应用程序(Visual Studio 2012)中的默认线程

来自分类Dev

如何在C ++中从控制台应用程序显示MFC对话框?

来自分类Dev

C#控制台应用程序中剪贴板的奇怪行为

来自分类Dev

强制控制台应用程序即使在C#中处于繁忙状态也要打印

来自分类Dev

在C#控制台应用程序中添加“ --help”参数

来自分类Dev

输出屏幕在C#控制台应用程序中突然消失?

来自分类Dev

C#控制台应用程序中的多个全局热键

来自分类Dev

在C#的控制台应用程序中验证字符串仅包含字母

来自分类Dev

在Visual Studio 2012中对C ++控制台应用程序进行单元测试

来自分类Dev

如何从C#控制台应用程序写入Azure WebJobs中的日志?

来自分类Dev

如何使用C#在内存中执行.NET控制台应用程序?

来自分类Dev

C#线程:新线程中的控制台应用程序不可见

来自分类Dev

在C#控制台应用程序app.config中嵌入Webclient的凭据?

来自分类Dev

如何在C#控制台应用程序中播放背景音乐

来自分类Dev

如何在C#控制台应用程序中返回简单的int值

来自分类Dev

如何在c#控制台应用程序中从.cshtml(razor)模板创建pdf

来自分类Dev

如何在控制台应用程序C#中打印值

Related 相关文章

  1. 1

    如何从C#中的控制台应用程序运行Web应用程序

  2. 2

    如何使用PeekNamedPipe()从Delphi Code中读取运行控制台应用程序的错误

  3. 3

    应用程序控制台输出和Delphi中对TMemo的正确编码

  4. 4

    Delphi控制台应用程序:如何在消息对话框中添加OnHelp?

  5. 5

    如何使用PeekNamedPipe()从Delphi Code中读取运行控制台应用程序的错误

  6. 6

    线程不是在Delphi的控制台应用程序中终止吗?

  7. 7

    如何在.NET 5.0控制台应用程序上的C#中检查Windows版本

  8. 8

    如果用户在C#程序中打印“ x”,如何使控制台应用程序退出?

  9. 9

    如何在C#中的控制台应用程序中激活代码的不同部分

  10. 10

    在C中按“ Ctrl + C”时如何防止控制台应用程序终止?

  11. 11

    C#托管服务控制台应用程序的运行状况检查

  12. 12

    在控制台应用程序中捕获ctrl + c事件(多线程)

  13. 13

    C#很小的控制台应用程序(Visual Studio 2012)中的默认线程

  14. 14

    如何在C ++中从控制台应用程序显示MFC对话框?

  15. 15

    C#控制台应用程序中剪贴板的奇怪行为

  16. 16

    强制控制台应用程序即使在C#中处于繁忙状态也要打印

  17. 17

    在C#控制台应用程序中添加“ --help”参数

  18. 18

    输出屏幕在C#控制台应用程序中突然消失?

  19. 19

    C#控制台应用程序中的多个全局热键

  20. 20

    在C#的控制台应用程序中验证字符串仅包含字母

  21. 21

    在Visual Studio 2012中对C ++控制台应用程序进行单元测试

  22. 22

    如何从C#控制台应用程序写入Azure WebJobs中的日志?

  23. 23

    如何使用C#在内存中执行.NET控制台应用程序?

  24. 24

    C#线程:新线程中的控制台应用程序不可见

  25. 25

    在C#控制台应用程序app.config中嵌入Webclient的凭据?

  26. 26

    如何在C#控制台应用程序中播放背景音乐

  27. 27

    如何在C#控制台应用程序中返回简单的int值

  28. 28

    如何在c#控制台应用程序中从.cshtml(razor)模板创建pdf

  29. 29

    如何在控制台应用程序C#中打印值

热门标签

归档