为什么这段代码不能像在 Inno Setup 中那样工作?

Why doesn't this code work like it should in Inno Setup?

在脚本的最开始我有这些代码行:

#define ISSI_Splash "C:\InnoSetupProject\Images\client.bmp"                    
#define ISSI_Splash_T 3                                                                         
#define ISSI_Splash_X 500                                                                       
#define ISSI_Splash_Y 220

在我的 [Setup] 部分中,我添加了指令:

AppMutex=ABClientLaunchMutex

然后在 [Code] 部分创建互斥量:

[Code]
function ISSI_InitializeSetup : Boolean;
begin
  Result := True;
  CreateMutex('ABClientLaunchMutex');
end;

#define ISSI_InitializeSetup

这两行代码在脚本的末尾:

#define ISSI_IncludePath "C:\ISSI" 
#include ISSI_IncludePath+"\_issi.isi"

但这并不像人们预期的那样有效。每当我启动安装程序时,它都会立即向我显示互斥锁的消息,即我的应用程序已经 运行,但事实并非如此。我没有在全局命名空间中创建我的互斥体,所以我不需要使用 Global\ 前缀。 如果我在开头注释那 4 个 #define 指令,那么互斥量将根本不起作用。
你能告诉我我的代码有什么问题所以它可以这样工作吗?

And I need to use the AppMutex if want to prevent the installer from running if my application is already installed and launched.

我认为你的错误是你在安装脚本本身中创建了互斥体,而你的应用程序应该这样做。

我的脚本中只有 AppMutex 一次:

[setup]
AppMutex=xxxyyyzzz

如文档所述:

Use of this directive requires that you add code to your application which creates a mutex with the name you specify in this directive.

文档提供了示例。下面是我在 Visual C++ MFC 项目中的做法:

BOOL CMeetingScheduleAssistantApp::InitInstance()
{
    CString strMutex;

    stMutex.LoadString(IDS_APP_MUTEX);

    m_hMutex = ::CreateMutex(nullptr, FALSE, strMutex);

    ...
    ...
}