Re[3]: Windows Vista программисту
От: Roman Odaisky Украина  
Дата: 17.01.08 21:29
Оценка:
Здравствуйте, Пётр Седов, Вы писали:

SC>>>3) Есть ли стоящие внимания новшества в WinAPI.

RO>>Так даже если есть, всё равно ими нельзя пользоваться из соображений обратной совместимости.
ПС>Можно явно запрашивать указатель на WinAPI-шную функцию с помощью GetProcAddress. Тогда программа будет работать и в старых версиях Windows.

Э-э... А что, собственно, делать, если она их там не найдет?
До последнего не верил в пирамиду Лебедева.
Re[7]: Windows Vista программисту
От: Roman Odaisky Украина  
Дата: 17.01.08 21:40
Оценка:
Здравствуйте, Sakura-chan, Вы писали:

RO>> Админ поставил программу, а потом пришел Вася, влез в ее настройки и внедрил туда какую-то злонамеренную функциональность. Программа ведь исполняется от имени юзера и может делать всё то, но не более, что позволено самому юзеру.


SC>Я имею в виду, что в идеале должна быть ситуация, когда программа имеет доступ к только своей папке. Но юзер — не имеет. Т.е. для программы было бы если исключение из прав юзера. Хотя с другой стороны, конечно, если программа позволяет юзеру ковырять её саму через её же интерфейс, то это дыра будет... я не подумал с этой стороны :)


Как ни крути, приходится съезжать на священные войны. Всё это давно в оффтопике есть: четкие привилегии на разные директории и возможность программе исполняться с привилегиями, отличными от привилегий юзера. Поставь себе Убунту, поиграйся. Это, кстати, помогает писать более хорошие программы для MS Windows. Ну, и есть риск на Windows забить :-)

RO>> А в последних версиях Винды как раз структура директорий становится похожей на FHS. /usr — Program Files, /home — Documents and Settings, /etc — реестр, /var — неясно (Documents and Settings\All Users\Application Data?).


SC>Да, но никто не мешает мне поставить прогу в D:\GAMES, как я уже сказал. И получится исключение из всех правил. Потому что они распространяются только на Program Files. Разве что если закрыть юзерам всё кроме их личной папки...


По-хорошему, так и должно быть. В (нет, только не СВ!) некоторых других ОС так и есть: юзерам можно только в свою директорию, разве что еще во временную.

RO>> Ага, кажется, понял. Ты о том, куда программе девать данные вроде какого-нибудь внутреннего кеша?


SC>Угу. Или логи, статистику, общие настройки. Как я уже писал в соседнем ответе, подойдёт All Users, вроде, но не логично снова — логи это не файлы пользователей, это личные файлы программы.


К общим настройкам положено иметь доступ только админу. Логи/статистику/кеш следует передавать по определенному протоколу заранее запущенному процессу, который запишет данные уже со своими правами. Так сделан системный лог в большинстве ОС, например.
До последнего не верил в пирамиду Лебедева.
Re[4]: Windows Vista программисту
От: Пётр Седов Россия  
Дата: 17.01.08 23:24
Оценка: +1
Здравствуйте, Roman Odaisky, Вы писали:

ПС>>Можно явно запрашивать указатель на WinAPI-шную функцию с помощью GetProcAddress. Тогда программа будет работать и в старых версиях Windows.

RO>Э-э... А что, собственно, делать, если она их там не найдет?
Если WinAPI-шная функция отсутствует, то можно:

1. Выполнить fallback-код, например:
typedef COLORREF (WINAPI * PSetDCBrushColorProc)(HDC hDC, COLORREF Color);
static PSetDCBrushColorProc s_pSetDCBrushColor = NULL;

// вызывается в начале работы программы
void Init()
{
  assert(s_pSetDCBrushColor == NULL);
  HINSTANCE hLib = GetModuleHandle(L"gdi32.dll");
  assert(hLib != NULL);
  s_pSetDCBrushColor = reinterpret_cast<PSetDCBrushColorProc>(GetProcAddress(hLib, "SetDCBrushColor"));
}

#ifndef DC_BRUSH
#define DC_BRUSH 18
#endif

void PaintRect(HDC hDC, const RECT& Rect, COLORREF Color)
{
  assert((Rect.left <= Rect.right) && (Rect.top <= Rect.bottom));
  if (s_pSetDCBrushColor != NULL)
  {
    // начиная с Windows 98 и Windows 2000
    (*s_pSetDCBrushColor)(hDC, Color);
    HBRUSH b = static_cast<HBRUSH>(GetStockObject(DC_BRUSH));
    FillRect(hDC, &Rect, b);
  }
  else
  {
    // старая Windows, fallback-код
    HBRUSH hBrush = CreateSolidBrush(Color); // можно cache-ировать
    if (hBrush == NULL)
    {
      throw runtime_error("Cannot create brush.");
    }
    FillRect(hDC, &Rect, hBrush);
    DeleteObject(hBrush);
  }
}

Так делает метод CMirrorFile::Close в MFC 6.0, он явно запрашивает функцию ReplaceFile из kernel32.dll.

2. Ничего не делать. Например, отсутствует функция HeapCompact. Значит не судьба ужать heap.

3. Заблокировать пункт меню или кнопку. Или не блокировать, а при нажатии показать сообщение «у вас старая Windows, возможность недоступна».
Пётр Седов (ушёл с RSDN)
Re[8]: Windows Vista программисту
От: Sakura-chan Россия http://sakuranoanime.ru
Дата: 18.01.08 08:35
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Как ни крути, приходится съезжать на священные войны. Всё это давно в оффтопике есть: четкие привилегии на разные директории и возможность программе исполняться с привилегиями, отличными от привилегий юзера. Поставь себе Убунту, поиграйся. Это, кстати, помогает писать более хорошие программы для MS Windows. Ну, и есть риск на Windows забить


Уже давно поставил, тока КУбунту ^^ Я как раз к тому и клоню (слегка знаю линукс), что там проще. Можно и прогу открыть с правами админа, не выходя из юзера. Я типа критикую винду слегка

RO>По-хорошему, так и должно быть. В (нет, только не СВ!) некоторых других ОС так и есть: юзерам можно только в свою директорию, разве что еще во временную.


Неа! Тогда придётся иметь только один логический диск. И один винт всего. Любой другой винт не может быть внутри C:\D&S\User и будет доступен тока админу. В винде физическая ФС, а в оффтопике — виртуальная.

RO> К общим настройкам положено иметь доступ только админу.


А всегда ли это правильно? Смотря что за прога — админ может стать человеком на побегушках по фирме
(что-то жёсткий оффтопик пошёл )

RO> Логи/статистику/кеш следует передавать по определенному протоколу заранее запущенному процессу, который запишет данные уже со своими правами.


Но это же через .. одно место Хотя мысль здравая, но жутко криво выглядит

RO> Так сделан системный лог в большинстве ОС, например.


В винде это Журналы Событий. Но что-то мне не очень нравится идея. Они ограничены, описания как-то регистрировать надо... Куда проще тупо писать текстовый файл. Можно что хочешь писать, создавать новые файлы по датам итд. Быстро и просто, ничего не надо. Про линукс не знаю — я из программирования там знаю тока функцию fork()
Itsumo sobani, itsumo hitori.
Re[6]: Windows Vista программисту
От: Sakura-chan Россия http://sakuranoanime.ru
Дата: 18.01.08 08:50
Оценка:
Здравствуйте, The Lex, Вы писали:

TL>ЗЫ: но необходимости программам "писать только куда надо" это не отменяет!


Кстати, а где эти самые рекомендации есть?

TL>Дык я не про продажу — я про использование... Не знал?


Я стараюсь перейти на бесплатное, вот

TL>Дык это rtfm


RTFM ноута содержит тока "какой кнопочкой включить ноутбук" для блондинок ^^

TL>Лично я скорее с обратной ситуацией сталкивался, когда новое железо на старых чипсетах + ОС 2000 не хотело работать "по полной" — зато на XP — "аж бегом!" И я, например, в XP люблю ее "мультяшные окна" — и не люблю когда отключают обратно в "серое казарменное безмолвие" (к)


Впервые увидев ХР я назвал это "клоунский интерфейс" ^^ Сейчас привык, но долго плевался.

SC>>Дык а смысл. Можно тогда в той же студии и отлажвиать. Зачем оффтопичная ОС — тормозить комп посредством виртуалки?

TL> Ну дык зато "под ОС" — причем "ОС" — с Особо Больших буков.

<мечты>Вот бы под неё научиться писать тоже</мечты>

TL>ЗЫ: а, например, как эффективно работать "в обратном порядке" — т.е. писать под "большую ОС", но работать под виндой?


Пока что kubuntu у меня тока под qemu живёт. Разглядываю ^^
Itsumo sobani, itsumo hitori.
Re[5]: Windows Vista программисту
От: Sakura-chan Россия http://sakuranoanime.ru
Дата: 18.01.08 08:57
Оценка:
Здравствуйте, Пётр Седов, Вы писали:

Отличные варианты. Хочу тока спросить по первому. У меня первая мысль была другая:


hDLL = LoadLibrary ("библиотека.dll");
WindowsXPfunc = (что-то)GetProcAddress (hDLL, "WindowsXPfunc"); // Функция с 2 параметрами
if (!WindowsXPfunc) WindowsXPfunc = Dummy_2p;
...
void __stdcall Dummp_1p (int a) { return; }
void __stdcall Dummp_2p (int a, int b) { return; }


В таком способе есть какой недостаток?
(кстати, так можно и сделать свою реализацию, упрощённую или замену)
Itsumo sobani, itsumo hitori.
Re[9]: Windows Vista программисту
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 18.01.08 13:23
Оценка: 1 (1)
Здравствуйте, Sakura-chan, Вы писали:

SC>Уже давно поставил, тока КУбунту ^^ Я как раз к тому и клоню (слегка знаю линукс), что там проще. Можно и прогу открыть с правами админа, не выходя из юзера. Я типа критикую винду слегка


Из консоли: runas/user:<user> <command>
Из GUI: зажимаешь шифт, кликаешь правой кнопкой, выбираешь Run as... в меню.
Ce n'est que pour vous dire ce que je vous dis.
Re[10]: Windows Vista программисту
От: Sakura-chan Россия http://sakuranoanime.ru
Дата: 18.01.08 13:38
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>Из консоли: runas/user:<user> <command>

DR>Из GUI: зажимаешь шифт, кликаешь правой кнопкой, выбираешь Run as... в меню.

Хе... Тогда беру свои слова обратно.
Itsumo sobani, itsumo hitori.
Re[4]: Windows Vista программисту
От: Sakura-chan Россия http://sakuranoanime.ru
Дата: 18.01.08 13:39
Оценка:
Здравствуйте, The Lex, Вы писали:

TL>ЗЫ: кстати, кто в курсе: когда объявлены предполагаемые окончания продаж XP?


Вот тут сроки написаны.
http://forums.microsoft.com/TechNet-RU/ShowPost.aspx?PostID=2697345&amp;SiteID=40
Если лень, то выкопирывоваю кусочками


Во-первых, Windows XP не прекратит своего существования 30 июня 2008 года. На эту дату назначено прекращение поставок OEM-версий XP изготовителям компьютерных устройств для предустановки на новые ПК и продажи через розничную сеть.

Что же касается прекращения поддержки Windows XP, то здесь компания Microsoft отмечает, что основная поддержка этой операционной системы прекратится в апреле 2009 года, а расширенная поддержка, связанная с исправлением ошибок безопасности ОС и других важных ошибок, закончится в 2014 году.

Direct OEM и Retail License будет доступна до 30 июня 2008г
System Builder License будет доступна до 31 января 2009г

Itsumo sobani, itsumo hitori.
Re[10]: Windows Vista программисту
От: Roman Odaisky Украина  
Дата: 18.01.08 22:58
Оценка:
Здравствуйте, Don Reba, Вы писали:

SC>>Уже давно поставил, тока КУбунту ^^ Я как раз к тому и клоню (слегка знаю линукс), что там проще. Можно и прогу открыть с правами админа, не выходя из юзера. Я типа критикую винду слегка :)


DR>Из консоли: runas/user:<user> <command>

DR>Из GUI: зажимаешь шифт, кликаешь правой кнопкой, выбираешь Run as... в меню.

Это аналог su. Аналога sudo в MS Windows нет.
До последнего не верил в пирамиду Лебедева.
Re[11]: Windows Vista программисту
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 18.01.08 23:27
Оценка: 1 (1) -1
Здравствуйте, Roman Odaisky, Вы писали:

DR>>Из консоли: runas/user:<user> <command>

DR>>Из GUI: зажимаешь шифт, кликаешь правой кнопкой, выбираешь Run as... в меню.

RO>Это аналог su. Аналога sudo в MS Windows нет.


И отлично. Чего холиворить на пустом месте?
Ce n'est que pour vous dire ce que je vous dis.
Re[6]: Windows Vista программисту
От: Пётр Седов Россия  
Дата: 19.01.08 16:18
Оценка:
Здравствуйте, Sakura-chan, Вы писали:

SC>Отличные варианты. Хочу тока спросить по первому. У меня первая мысль была другая:


SC>
SC>hDLL = LoadLibrary ("библиотека.dll");
SC>WindowsXPfunc = (что-то)GetProcAddress (hDLL, "WindowsXPfunc"); // Функция с 2 параметрами
SC>if (!WindowsXPfunc) WindowsXPfunc = Dummy_2p;
SC>...
SC>void __stdcall Dummp_1p (int a) { return; }
SC>void __stdcall Dummp_2p (int a, int b) { return; }
SC>


SC>В таком способе есть какой недостаток?

Я не вижу здесь никаких недостатков. Например, так можно сделать с HeapCompact:
static UINT WINAPI HeapCompact_Fallback(HANDLE hHeap, DWORD dwFlags)
{
  // ничего не делать
  return 0;
}

typedef UINT (WINAPI * PHeapCompactProc)(HANDLE hHeap, DWORD dwFlags);
static PHeapCompactProc s_pHeapCompact = NULL;

// вызывается в начале работы программы
void Init()
{
  assert(s_pHeapCompact == NULL);
  HINSTANCE hLib = GetModuleHandle(L"kernel32.dll");
  assert(hLib != NULL);
  s_pHeapCompact = reinterpret_cast<PHeapCompactProc>(GetProcAddress(hLib, "HeapCompact"));
  if (s_pHeapCompact == NULL)
  {
    // старая Windows
    s_pHeapCompact = &HeapCompact_Fallback;
  }
}

LRESULT CALLBACK HandleMessage(HWND hWindow, UINT MessageType, WPARAM wParam, LPARAM lParam)
{
  switch (MessageType)
  {
  ...
  case WM_COMPACTING:
  {
    HANDLE hProcessHeap = GetProcessHeap();
    (*s_pHeapCompact)(hProcessHeap, /*dwFlags:*/0);
    return 0;
  }
  ...
  }
}


Но такой способ не всегда годится. Например, хочется сделать top-level окно непрямоугольной формы. Если user32.dll экспортирует функцию SetLayeredWindowAttributes, то лучше использовать её. Если она отсутствует, то придётся создать GDI-регион и назначить его окну вызовом функции SetWindowRgn.
Пётр Седов (ушёл с RSDN)
Re[2]: Windows Vista программисту
От: Sakura-chan Россия http://sakuranoanime.ru
Дата: 20.01.08 05:35
Оценка:
Здравствуйте, dip_2000, Вы писали:

_>http://www.oszone.net/4364/Windows_Vista

_>http://www.oszone.net/display.php?id=4523&amp;do=print
_>http://www.microsoft.com/technet/technetmag/issues/2007/04/VistaKernel/default.aspx?loc=ru
_>там много рекламной шелухи, но очень разносторонне, и дальше ясно будет куда копать.

Действительно, интересные статьи, спасибо!
Itsumo sobani, itsumo hitori.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.