我正在编写一个C++代码来确定它运行的操作系统.我使用GetVersionEx()API来做到这一点,并将此代码作为教程,但它似乎无法处理Windows 8.有谁知道如何修复它在Windows 8下运行?
我尝试了解ReadDirectoryChangesW功能,以便能够有效地了解多个目录中的内容更改(文件被覆盖,文件被删除,重命名等等).
我最近的一个观察是,对于每个文件写入操作,我总是收到两个单个文件的通知.
我非常仔细地追踪了这一点,我确信,如果我覆盖一个文件(比如一个带有新内容的.txt文件 - 里面几个额外的字母),ReadDirectoryChangesW()每个文件保存会通知我两次.
这是严肃的事情,因为我希望每次更改只通知一次.我不希望无意中重复在我的应用程序中只发生一次的操作.
这种行为是否已知?有没有办法每次更改只收到一个通知,好吗?有没有办法有效避免双重通知?
我用:
我使用非常基本的代码来进行测试,但你会想看到它,所以这里是:
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) 例如:
130.45.34.36255.255.240.0什么是网络ID /子网地址和广播地址?
在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)
编译器如何演绎(或转换)的类型char来char*时char{}或char()用作论据?
现在,如果我同时拥有char和char*重载,那么它可以正常工作而不会出现任何错误/警告歧义:
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"功能:
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但不能成功.
我无法制作fooA或fooB过载,因为这些是C函数.
我有一个从大型数组中读取数据的程序,我最初在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)
但是当我尝试编译编译器崩溃堆栈溢出后现在更改所有数组后,我以为我通过将数组更改为向量来释放堆栈中的内存空间但是看起来我有相反的结果,为什么呢??
我该如何处理这些大数组呢?(它们是固定不变的值或大小)
我有一个内存堆管理器,它根据系统上的处理器数量将堆分成不同的段.内存只能分配给当前运行的线程处理器的分区.这将有助于不同的处理器继续运行,即使两个不同的处理器想要同时分配内存,至少我相信.
我找到了GetCurrentProcessorNumber()Windows 的功能,但这仅适用于Windows Vista及更高版本.有没有一种适用于Windows XP的方法?
另外,这可以通过POSIX系统上的pthread来完成吗?
我必须使用任何Windows API来区分真实地址和VM地址.我正在使用GetAdaptersAddressesAPI来填充本地计算机的IP地址列表.除了与VMware网络适配器关联的地址和其他地址(自动配置和隧道适配器地址)之外,我只需要提取"真实"地址.我无法找到任何API或任何标志来区分它.有什么办法可以做到吗?
PS:返回IfType的IP_ADAPTER_ADDRESSES结构中的标志GetAdaptersAddresses无法帮助我区分VMware地址和实际地址.
我想验证已签名的可执行映像的证书(通过验证,我的意思是告诉签名是否来自MS/Adobe/Oracle等).Windows是否为此任务提供api?我该怎么办,不知道.任何帮助,将不胜感激.我正在使用Windows和C++.我想验证本机可执行映像,而不是.NET程序集或Java jar文件.
UPDATE
好的,我会尽快描述我想要的东西.
1)验证PE证书.签名是否有效.当签名嵌入在PE中并且签名位于安全目录中时,它应该工作.(我在sysinternals论坛上发现这个并且运行正常,所以我不再需要这个了).
2)告诉谁是文件的签名者/出版者.我知道它可以通过CryptQueryObject实现(我找到了一个工作示例,虽然它不能与安全目录一起使用),但不知道如何将它与安全目录文件一起使用.
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++ ×7
windows ×4
c ×2
c++11 ×2
c++14 ×2
networking ×2
visual-c++ ×2
winapi ×2
arrays ×1
broadcast ×1
c++17 ×1
certificate ×1
executable ×1
file-io ×1
ip ×1
linux ×1
nic ×1
pthreads ×1
stack ×1
subnet ×1
validation ×1
vector ×1
vmware ×1
windows-8 ×1
windows-xp ×1