小编Aja*_*jay的帖子

Windows 8下的GetVersionEx

我正在编写一个C++代码来确定它运行的操作系统.我使用GetVersionEx()API来做到这一点,并将此代码作为教程,但它似乎无法处理Windows 8.有谁知道如何修复它在Windows 8下运行?

c++ windows winapi windowsversion windows-8

18
推荐指数
3
解决办法
2万
查看次数

C++ WinApi:ReadDirectoryChangesW()接收双重通知

我尝试了解ReadDirectoryChangesW功能,以便能够有效地了解多个目录中的内容更改(文件被覆盖,文件被删除,重命名等等).

我最近的一个观察是,对于每个文件写入操作,我总是收到两个单个文件的通知.

我非常仔细地追踪了这一点,我确信,如果我覆盖一个文件(比如一个带有新内容的.txt文件 - 里面几个额外的字母),ReadDirectoryChangesW()每个文件保存会通知我两次.

这是严肃的事情,因为我希望每次更改只通知一次.我不希望无意中重复在我的应用程序中只发生一次的操作.

这种行为是否已知?有没有办法每次更改只收到一个通知,好吗?有没有办法有效避免双重通知?

我用:

  • 非托管C++
  • Visual Studio 2012
  • Windows 7 x64

我使用非常基本的代码来进行测试,但你会想看到它,所以这里是:

HANDLE hDir = CreateFile(
    lpDir,
    FILE_LIST_DIRECTORY,
    FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
    NULL, 
    OPEN_EXISTING, 
    FILE_FLAG_BACKUP_SEMANTICS, 
    NULL);

    int nCounter = 0;
    FILE_NOTIFY_INFORMATION strFileNotifyInfo[1024];
    DWORD dwBytesReturned = 0;   

    while(TRUE)
    {
        if( ReadDirectoryChangesW ( hDir, (LPVOID)&strFileNotifyInfo, sizeof(strFileNotifyInfo), FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE, &dwBytesReturned, NULL, NULL) == 0)
        {
            ErrorCheck(_T("Reading Directory Change"));
        }
        else
        {
            _tcout << _T("File …
Run Code Online (Sandbox Code Playgroud)

c++ windows file-io winapi visual-c++

18
推荐指数
2
解决办法
1万
查看次数

如何从IP地址和子网掩码中确定网络和广播地址?

例如:

  • IP地址: 130.45.34.36
  • 面具: 255.255.240.0

什么是网络ID /子网地址和广播地址?

ip networking network-programming broadcast subnet

18
推荐指数
1
解决办法
5万
查看次数

为什么char {}和char()用作char *参数的临时变量?

在Visual C ++ 2017(带有/std:c++14或带有/std:c++17)中,以下代码有效:

void TakePtr(char*); // const or not

int main()
{ 
     TakePtr(char{});
     TakePtr(char());
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会这样。

显然,以下内容也将起作用(按预期方式):

void TakeChar(char);

   TakeChar(char{});
   TakeChar(char());
Run Code Online (Sandbox Code Playgroud)

编译器如何演绎(或转换)的类型charchar*char{}char()用作论据?

现在,如果我同时拥有charchar*重载,那么它可以正常工作而不会出现任何错误/警告歧义:

void TakePtr(char*);
void TakePtr(char);

    TakePtr(char{});  // Chooses 'char'
    TakePtr(char());  // Chooses 'char'
Run Code Online (Sandbox Code Playgroud)

为什么编译器可以接受char{}for TakePtr(char*)?当选择更好的版本时,为什么不给出警告/错误?这种行为势必会破坏现有代码。

当然,编译器对以下内容不满意:

void TakePtr(char*);

    char c{};
    TakePtr(c);
Run Code Online (Sandbox Code Playgroud)

c++ c++14 c++17 visual-c++-2017

18
推荐指数
2
解决办法
423
查看次数

基于模板参数类型调用函数

有两个"C"功能:

void fooA(const char*);
void fooW(const wchar_t*);
Run Code Online (Sandbox Code Playgroud)

然后有一个包装模板函数:

template<typename _TChar>
void foo(const _TChar* str)
{
     // call fooA or fooB based on actual type of _TChar
     // std::conditional .. ?
         // fooA(str); 
         // fooW(str);
}
Run Code Online (Sandbox Code Playgroud)

如果调用者调用foo("Abc"),则此模板函数应进行编译时调用fooA.同样,foo(L"Abc")应该做最后的调用fooW.

我怎么做?我想过使用std::conditional但不能成功.

我无法制作fooAfooB过载,因为这些是C函数.

c++ visual-c++ c++11 c++14

17
推荐指数
4
解决办法
5438
查看次数

大数组,std :: vector和堆栈溢出

我有一个从大型数组中读取数据的程序,我最初在Visual Studio中将程序划分为两个独立的项目,每个项目分别工作正常,但是当我尝试将它们组合在一起时,程序在调试时滑动了一些步骤.我对C++很新,所以我开始做一些研究,我发现也许我正在用那些巨大的数组填充堆栈,我应该尝试将它们放在堆上.

我决定更改每个数组std::vector并以这种方式初始化它们:

std::vector<double> meanTimeAO = { 0.4437, 0.441, 0.44206, 0.44632, 0.4508, 0.45425,...}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试编译编译器崩溃堆栈溢出后现在更改所有数组后,我以为我通过将数组更改为向量来释放堆栈中的内存空间但是看起来我有相反的结果,为什么呢??

我该如何处理这些大数组呢?(它们是固定不变的值或大小)

c++ arrays stack vector c++11

16
推荐指数
2
解决办法
2769
查看次数

如何找到运行线程的处理器编号?

我有一个内存堆管理器,它根据系统上的处理器数量将堆分成不同的段.内存只能分配给当前运行的线程处理器的分区.这将有助于不同的处理器继续运行,即使两个不同的处理器想要同时分配内存,至少我相信.

我找到了GetCurrentProcessorNumber()Windows 的功能,但这仅适用于Windows Vista及更高版本.有没有一种适用于Windows XP的方法?

另外,这可以通过POSIX系统上的pthread来完成吗?

c linux windows-xp memory-management pthreads

15
推荐指数
2
解决办法
1万
查看次数

区分VMware网络适配器与物理网络适配器 - 或 - 检测虚拟网络适配器

我必须使用任何Windows API来区分真实地址和VM地址.我正在使用GetAdaptersAddressesAPI来填充本地计算机的IP地址列表.除了与VMware网络适配器关联的地址和其他地址(自动配置和隧道适配器地址)之外,我只需要提取"真实"地址.我无法找到任何API或任何标志来区分它.有什么办法可以做到吗?

PS:返回IfTypeIP_ADAPTER_ADDRESSES结构中的标志GetAdaptersAddresses无法帮助我区分VMware地址和实际地址.

c windows vmware networking nic

15
推荐指数
1
解决办法
3576
查看次数

从可执行文件读取并验证证书

我想验证已签名的可执行映像的证书(通过验证,我的意思是告诉签名是否来自MS/Adob​​e/Oracle等).Windows是否为此任务提供api?我该怎么办,不知道.任何帮助,将不胜感激.我正在使用Windows和C++.我想验证本机可执行映像,而不是.NET程序集或Java jar文件.

UPDATE


好的,我会尽快描述我想要的东西.

1)验证PE证书.签名是否有效.当签名嵌入在PE中并且签名位于安全目录中时,它应该工作.(我在sysinternals论坛上发现这个并且运行正常,所以我不再需要这个了).

2)告诉谁是文件的签名者/出版者.我知道它可以通过CryptQueryObject实现(我找到了一个工作示例,虽然它不能与安全目录一起使用),但不知道如何将它与安全目录文件一起使用.

c++ windows validation executable certificate

15
推荐指数
2
解决办法
2万
查看次数

C++为什么呼叫是暧昧的?

class myClass {
   int arr[100];
public:
    void *get(long i, void* const to) const;
    void *get(long i, bool nog);
    void *tstfn(void* const to) { return get(0L,to); }
};
Run Code Online (Sandbox Code Playgroud)

gcc -Wall说:

dt.cpp: In member function ‘void* myClass::tstfn(void*)’:
dt.cpp:6:49: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second: [enabled by default]
dt.cpp:4:9: note: candidate 1: void* myClass::get(long int, void*) const
dt.cpp:5:9: note: candidate 2: void* myClass::get(long int, …
Run Code Online (Sandbox Code Playgroud)

c++

15
推荐指数
3
解决办法
1382
查看次数