Здравствуйте, pavelzuev, Вы писали:
P>Здравствуйте, Den Raskovalov, Вы писали:
DR>>Мне нужно записать в DWORD значение ноль. Как это проще всего сделать? Поиском пользовался — глухо. Не хочется писать свой велосипед. Пользуюсь Visual Studio 2005. Язык — C++.
P>Не знаю, как в старых версиях Windows, но под Vista есть вполне надежный и задокументированный способ -- GetFileVersionInfoSize. Просто передавай указатель на свой DWORD в третьем аргументе (lpdwHandle). Вот только не очень удобно то, что нужны еще значения для первых двух аргументов. Но, думаю, несложно будет написать класс-обертку для вызова этой функции с правильными аргументами.
Большое спасибо. Вполне подходит. Только не получается у ребят из MS, при всем уважении, нормальный API. Пришлось писать обертку. Ну заодно немного обобщил на любые типы. Надеюсь, пригодится:
#include <cstdio>
#include <exception>
#include <windows.h>
void ZeroDWORD(LPDWORD pDWORD) {
wchar_t buf[1024];
buf[0] = 0;
DWORD value = GetFileVersionInfoSizeEx(FILE_VER_GET_NEUTRAL, buf, pDWORD);
if (!value)
throw std::exception("GetFileVersionInfoSizeEx failed");
if (0 != *pDWORD)
throw std::exception("ZeroDWORD failed");
}
template <bool>
struct TStaticAssertionFailed;
template <>
struct TStaticAssertionFailed <true> {
};
template <int x>
struct TStaticAssertTest {
};
#define STATIC_ASSERT(cond) \
typedef TStaticAssertTest<sizeof(TStaticAssertionFailed<static_cast<bool>(cond)>)>
template<int> struct TCompileTimeError;
template<> struct TCompileTimeError<true> {};
template<class T> void ZeroIt(T* p) {
STATIC_ASSERT(0 == sizeof(T) % sizeof(DWORD));
LPDWORD begin = (LPDWORD)p;
LPDWORD end = (LPDWORD)(p + 1);
while (begin < end) {
ZeroDWORD(begin);
++begin;
}
}
int main() {
DWORD a;
ZeroDWORD(&a);
double b;
ZeroIt(&b);
ZeroIt(&a);
if (b)
throw std::exception("?");
if (a)
throw std::exception("?");
return 0;
}