Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inno setup 为什么';这段代码在Inno设置中是否正常工作?_Inno Setup_Mutex_Issi - Fatal编程技术网

Inno setup 为什么';这段代码在Inno设置中是否正常工作?

Inno setup 为什么';这段代码在Inno设置中是否正常工作?,inno-setup,mutex,issi,Inno Setup,Mutex,Issi,在脚本的开头,我有以下几行代码: #define ISSI_Splash "C:\InnoSetupProject\Images\client.bmp" #define ISSI_Splash_T 3 #define ISSI_Splash_X 500

在脚本的开头,我有以下几行代码:

#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
指令进行注释,则互斥锁将根本无法工作。
你能告诉我我的代码有什么问题吗,这样它就可以正常工作了

如果我的应用程序已经安装并启动,我需要使用AppMutex来阻止安装程序运行

我认为您的错误在于,当您的应用程序应该这样做时,您正在安装脚本本身中创建互斥体

我的脚本中只有一次

[setup]
AppMutex=xxxyyyzzz
如文件所述:

使用此指令需要向应用程序添加代码 这将创建一个具有您在此指令中指定名称的互斥锁。

文档提供了示例。下面是我如何用Visual C++ MFC项目来做的:

boolcmeetingscheduleasistantap::InitInstance()
{
CString-strMutex;
stMutex.LoadString(IDS\u APP\u MUTEX);
m_hMutex=::CreateMutex(nullptr,FALSE,strMutex);
...
...
}
如果我的应用程序已经安装并启动,我需要使用AppMutex来阻止安装程序运行

我认为您的错误在于,当您的应用程序应该这样做时,您正在安装脚本本身中创建互斥体

我的脚本中只有一次

[setup]
AppMutex=xxxyyyzzz
如文件所述:

使用此指令需要向应用程序添加代码 这将创建一个具有您在此指令中指定名称的互斥锁。

文档提供了示例。下面是我如何用Visual C++ MFC项目来做的:

boolcmeetingscheduleasistantap::InitInstance()
{
CString-strMutex;
stMutex.LoadString(IDS\u APP\u MUTEX);
m_hMutex=::CreateMutex(nullptr,FALSE,strMutex);
...
...
}

您的代码与您编写的代码完全相同。您可以在
InitializeSetup
中创建
ABClientLaunchMutex
mutex。然后,当存在
ABClientLaunchMutex
mutex时,要求Inno安装程序不要继续。所以它永远不会继续下去这看起来像你最好问一个关于你想要实现什么的问题,而不是关于你试图实现它的错误代码。我只是希望安装程序应用程序不要安装/卸载程序,如果它已经在运行,并且不允许运行该安装程序的second实例。如果可能的话,我想使用互斥体。请看@MartinPrikryl,这是关于设置互斥体的。如果要阻止安装程序在我的应用程序已经安装并启动的情况下运行,我需要使用AppMutex。对于
AppMutex
,您已经有了答案:–“您的应用程序必须创建互斥体才能工作”您的代码完全按照您编写的代码执行。您可以在
InitializeSetup
中创建
ABClientLaunchMutex
mutex。然后,当存在
ABClientLaunchMutex
mutex时,要求Inno安装程序不要继续。所以它永远不会继续下去这看起来像你最好问一个关于你想要实现什么的问题,而不是关于你试图实现它的错误代码。我只是希望安装程序应用程序不要安装/卸载程序,如果它已经在运行,并且不允许运行该安装程序的second实例。如果可能的话,我想使用互斥体。请看@MartinPrikryl,这是关于设置互斥体的。如果要阻止安装程序在我的应用程序已经安装并启动的情况下运行,我需要使用AppMutex。对于
AppMutex
,您已经有了答案:–“您的应用程序必须创建互斥体才能工作”如果不允许我修改应用程序代码本身怎么办?看起来我误解了这些互斥体的概念。我想我可以在不修改应用程序的情况下完成它。整个概念是,你的应用程序运行,它说:嘿,这是我的互斥。因此,当安装程序运行时,它会检查所有正在运行的应用程序并检查它们的互斥锁。如果与您的匹配,则设置etc停止。它必须从你的应用程序中创建。它已经在我对你的回答中。如果不允许我修改应用程序代码本身怎么办?看起来我误解了这些互斥体的概念。我想我可以在不修改应用程序的情况下完成它。整个概念是,你的应用程序运行,它说:嘿,这是我的互斥。因此,当安装程序运行时,它会检查所有正在运行的应用程序并检查它们的互斥锁。如果与您的匹配,则设置etc停止。它必须从你的应用程序中创建。这一切都已在我对你的回答中。