Hungry Mind , Blog about everything in IT - C#, Java, C++, .NET, Windows, WinAPI, ...

DLGTEMPLATE

Бывает нужно прочитать шаблон диалога из ресурса. Для этого в библиотеке ATL есть набор полезных рюшечек: файл atlwin.h, класс _DialogSplitHelper. Например там есть объявление структур DLGTEMPLATEEX, DLGITEMTEMPLATEEX, реализации функций IsDialogEx, DlgTemplateItemCount, FindFirstDlgItem и FindNextDlgItem. Пользуйтесь на здоровье.

MacBook russian keyboard layout

Только что узнал, что на официальных Макбуках (сертифицированных для продажи в РФ и Украине) НАСТОЛЬКО уебищная раскладка клавиатуры. Снова этот кастрированный шифт и припизженная клавиша Ввод. Хорошо, что у меня америкос.

How to call GC.WaitForPendingFinalizers via CLR interop interfaces

HRESULT WaitForPendingFinalizers()
{
   const ATL::CComSafeArray<IUnknown *> assemblies = DefaultDomain()->GetAssemblies();
   const auto pAssemblyThunk = assemblies.GetAt(assemblies.GetLowerBound());
   const _AssemblyPtr pMsCorLibAssembly = pAssemblyThunk.p;
   const auto pGCType = pMsCorLibAssembly->GetType_2(L"System.GC");
   const BindingFlags bFlags = static_cast(BindingFlags_InvokeMethod | BindingFlags_Static | BindingFlags_Public);
   ATL::CComVariant vtTarget;
   ATL::CComSafeArray<VARIANT> saMethodArgs;
   const HRESULT hr = pGCType->InvokeMember_3(L"WaitForPendingFinalizers", bFlags, NULL, vtTarget, saMethodArgs);
   return hr;
}

WinDBG support dropped for immediate window?

Похоже, в Visual Studio 2012 отладчик больше не поддерживает команды WinDBG. Содержимое Immediate Window:

.load sos
expected an expression

Они, однако, сделали поддержку WinDBG путем выбора нужного отладчика в выпадающем списке:

Но необходимо установить WDK. SDK не канает.

Медленный он, конечно. И убогий в сравнении с привычным отладчиком Visual Studio, но что поделать?

Extra pdb information?

Update: code center premium. Ах, как хочется.

A comparison of C++11 language support in VS2012, g++ 4.7 and Clang 3.1

Apple снова первые! A comparison of C++11 language support in VS2012, g++ 4.7 and Clang 3.1

Change system drive letter in Windows

Недавно пришлось устанавливать Windows 7 x64 из работающей Windows 7 x32 (болванки не было нормальной для загрузки с нее). В результате буква системного диска стала G. Я такого не люблю и попытался всяческими способами сменить ее на C. В результате система перестала грузиться или оказалась в состоянии что-то в духе человека-овоща, подключенного к аппарату поддержки жизнедеяльности. А все потому, что реестр захламлен путями к файлам драйверов, COM библиотек и прочей важной ерунды. А пути там, да, абсолютные, включают букву системного диска. Ура, товарищи! Букву системного диска сменить НЕЛЬЗЯ, устанавливайте с оптических или других носителей.

How to set up Cisco VPN on MacOS X x64

How to set up Cisco VPN on MacOS X x64

MacOS X internals

Захотелось разобраться как работает оконная система MacOS X изнутри. В Windows все понятно и документировано - цикл сообщений, API для создания окон и манипуляции их состоянием. В замечательной OS X все спрятано за красивым фреймворком Cocoa. Годы хардфакинга в MFC/WinAPI подсказывают, что принципы построения графической оболочки везде одинаковы. Потратил время, докопался до места откуда растут ноги.

Механизм взаимодействия графической подсистемы с пользовательским кодом

Если создать в XCode простейшее AppKit приложение и запустить его - получим пустое окно на экране. Чудес, как обычно, не бывает - окно должно быть создано неким API. За композицию окон в OS X отвечает подсистема с замысловатым названием Quartz. В списке процессов можно обнаружить WindowServer, это собственно ядро Quartz. Именно там происходит формирование картинки для устройства отображения (монитора). Гугление на тему создания окон в OS X привело меня на страничку Header file for undocumented CoreGraphics SPI. Изучив контент я сделал вывод, что существует библиотека Core Graphics с низкоуровневым API для взаимодействия с WindowServer. Дабы убедиться, что Cocoa использует этот API, я поставил точку останова на функцию _CGSCreateWindowInline и запустил приложение. В результате получил такой стек вызовов:

#1 0x00007fff8fc8d64b in _CGSCreateWindowInline ()
#2 0x00007fff8fc8cd0b in CGSNewWindowWithOpaqueShape ()
#3 0x00007fff8be708e8 in _NSCreateWindowWithOpaqueShape2 ()
#4 0x00007fff8be6ed70 in -[NSWindow _commonAwake] ()
#5 0x00007fff8bf271c9 in -[NSWindow _reallyDoOrderWindow:relativeTo:findKey:forCounter:force:isModal:] ()
#6 0x00007fff8bf26a18 in -[NSWindow _doOrderWindow:relativeTo:findKey:forCounter:force:isModal:] ()
#7 0x00007fff8bf265ff in -[NSWindow orderWindow:relativeTo:] ()
#8 0x00007fff8be27c96 in -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] ()
#9 0x00007fff8be06b7d in loadNib ()
#10 0x00007fff8be060a9 in +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] ()
#11 0x00007fff8be05ede in -[NSBundle(NSNibLoading) loadNibNamed:owner:topLevelObjects:] ()
#12 0x00007fff8be05cbe in +[NSBundle(NSNibLoading) loadNibNamed:owner:] ()
#13 0x00007fff8be0247f in NSApplicationMain ()
#14 0x00000001000011b2 in main at /Users/admin/Development/CocoaInspector/CocoaInspector/main.m:13
#15 0x00007fff932127e1 in start ()
  

OK, это то, что нам нужно. Осталось выяснить как Core Graphics взаимодействует с процессом WindowServer. Ассемблерный листинг функции _CGSCreateWindowInline содержит инструкцию вызова системной процедуры mach_msg, которая является основным способом межпроцессного взаимодействия в операционной системе OS X.

Выводы: Core Graphics является закрытой недокументированной библиотекой для взаимодействия с графическим сервером средствами ядра путем отправки и получения сообщений.

Visual Studio 2012 RTM leaked

Уже можно найти на обменниках. Дядко ЦЯ своровал.

Copyright 2007-2011 Chabster