Re[2]: Заполнить DWORD нулями?
От: Den Raskovalov США http://users.livejournal.com/_denplusplus_
Дата: 17.08.08 22:03
Оценка: :)
Здравствуйте, 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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.