为什么这段代码不能像在 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);
...
...
}
在脚本的最开始我有这些代码行:
#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);
...
...
}