一生中运行一次的代码

时间:2018-01-11 12:34:50

标签: c++ windows visual-studio-2017

我正在尝试制作一个程序,将所选文件与硬盘驱动器序列号相关联,因此它不会在任何其他硬盘驱动器上运行。我必须设置硬盘驱动器序列号的部分应该在程序的生命周期中只运行一次。

我不知道如何实现这一点,互联网上的解决方案使用我不熟悉的宏。我希望使用Visual Studio 2017和Windows 10来实现这一点。

3 个答案:

答案 0 :(得分:4)

std::call_once仅在程序期间运行一次。

#include <mutex>
#include <iostream>
void set_serial_number()
{
    static std::once_flag flag1;
    std::call_once(flag1, [](){ std::cout << "Set hard drive serial number\n"; });
}

Demo

您可以尽可能多地调用set_serial_number,但传递给std::call_once调用的lambda中包含的逻辑只会执行一次。

如,

int main(){
    set_serial_number();
    set_serial_number();
    set_serial_number();
}

输出:

  

设置硬盘序列号

答案 1 :(得分:2)

保证静态函数/类成员只存在一次。像

这样的东西
class myThing {
    public:
        static const std::string hardDiskId;   
    private:
        std::string queryHardDiskId();
};

const std::string myThing::hardDiskId = queryHardDiskId();

将确保仅查询您的硬盘ID。

答案 2 :(得分:2)

您可以在磁盘上创建文件,并将附加了其他一些数据的序列号字符串的哈希值写入文件,并在下一次运行程序时读取。你可以使用openssl。

#include <openssl/sha.h>
...
  string tohash = serial + "secret_suffix";
  unsigned char hash[SHA_DIGEST_LENGTH]; // == 20
  SHA1(to_hash.c_str(), to_hash.length(), hash);
  write_to_file(hash);

您可以在安装应用程序时运行此程序。