Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.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
C++ 一生运行一次的代码_C++_Windows_Visual Studio 2017 - Fatal编程技术网

C++ 一生运行一次的代码

C++ 一生运行一次的代码,c++,windows,visual-studio-2017,C++,Windows,Visual Studio 2017,我正在尝试制作一个程序,将选定的文件与硬盘驱动器序列号关联,这样它就不会在任何其他硬盘驱动器上运行。我必须设置硬盘序列号的部分在程序的生命周期中只能运行一次 #include <mutex> #include <iostream> void set_serial_number() { static std::once_flag flag1; std::call_once(flag1, [](){ std::cout << "Set hard d

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

#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"; });
}
我不知道如何实现这一点,互联网上的解决方案使用宏,我不熟悉宏。我希望使用visual studio 2017和Windows 10实现此功能。

在程序期间只运行一次

#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"; });
}
输出:

设置硬盘驱动器序列号


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

class myThing {
    public:
        static const std::string hardDiskId;   
    private:
        std::string queryHardDiskId();
};

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

将确保只查询一次您的硬盘id。

您可以在磁盘上创建一个文件,并将附加了一些其他数据的序列号字符串哈希写入文件,然后在下次运行程序时读取。您可以为此使用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);
#包括
...
字符串tohash=serial+“secret\u后缀”;
无符号字符哈希[SHA_DIGEST_LENGTH];/==20
SHA1(to_hash.c_str(),to_hash.length(),hash);
将_写入_文件(散列);

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

您的任务可以拆分为几个独立的子任务。你对哪些方面有问题?到目前为止你想到了什么?如果有人克隆了你的硬盘会怎么样?可执行文件是否只运行“一次”?我希望您没有试图用这种机制保护有价值的东西。黑客需要几个小时才能反汇编您的程序,找到函数“IsTheRightSerialNumber?”,并进行修改以始终返回true。可能会重复“在程序生命周期内仅运行一次”这一说法-不明确,哪个生命周期:当前执行生命周期,或发布/发布版本生命周期。。。如果“程序”启动时“选定文件”已经存在,程序应该怎么做?a) 确认并在何时进行正常操作?b) 确认和何时退出与错误通知不匹配?c) 否则,它将在程序中执行一次lifetime@BishoyYouhanna:是的。
set\U serial\U number
中包含的
once\U标志
静态的
,这意味着在程序期间只有一个标志,它还存储一些状态(例如,布尔跟踪是否在之前的通话中使用过)。非常感谢你,不知道我是怎么错过的