Rust Win32 CreateMutexA 无法防止重复的应用程序实例

问题描述 投票:0回答:1

为了防止重复的应用程序实例运行,我使用

CreateMutexA
Win32 API 调用创建互斥体。但是,这并不能防止重复进程,因为会创建多个具有相同名称的互斥体。我做错了什么?

代码:

use windows::Win32::Foundation::{
    GetLastError,
    ERROR_ALREADY_EXISTS
};
use windows::Win32::System::Threading::{
    CreateMutexA,
};
use windows::core::PCSTR;

pub fn prevent_duplicate() {
    let mutex_key = static_key_as_string!();
    log::info!("Mutex value: {mutex_key}");

    log::info!("Creating Mutex");
    unsafe {
        match CreateMutexA(None, false, PCSTR(mutex_key.as_ptr() as *const u8)) {
            Ok(_) => {
                let error = GetLastError();
                log::error!("{:?} {:?}", error, ERROR_ALREADY_EXISTS);
                if error == ERROR_ALREADY_EXISTS {
                    log::info!("Mutex exists. Exiting");
                    std::process::exit(0)
                }
            },
            Err(_) => {
                log::error!("Could not check existence of Mutext. Continuing");
            },
        };
    }
}

输出过程1:

[INFO ] Mutex value: P889Z0Hhy2TKEPykDSLuSWdE9bJfNfCsK87aqgNGZ6b09NBIwBh6bwJBj98AkTzO
[INFO ] Creating Mutex
[ERROR] WIN32_ERROR(0) WIN32_ERROR(183)

输出过程2:

[INFO ] Mutex value: P889Z0Hhy2TKEPykDSLuSWdE9bJfNfCsK87aqgNGZ6b09NBIwBh6bwJBj98AkTzO
[INFO ] Creating Mutex
[ERROR] WIN32_ERROR(0) WIN32_ERROR(183)

编辑:将

bInitialOwner
设置为
true
仍然允许多个实例

winapi rust
1个回答
0
投票

检查字符串是否以空字符结尾。

PCSTR
要求你的字符串末尾有一个0字节; Rust 中的默认值是字符串不是以 null 结尾。

对于静态字符串,您可以在字符串末尾包含显式

\0
,或者使用语法
c"name"
,其类型为
&CStr
,即对以 null 结尾的字符串的引用。

© www.soinside.com 2019 - 2024. All rights reserved.