Файлы манифеста Windows являются ресурсами Win32. Другими словами, они встраиваются к концу EXE или DLL. Можно использовать LoadLibraryEx, FindResource, LoadResource и LockResource для загрузки встроенного ресурса.
Вот простой пример, который извлекает его собственную декларацию...
BOOL CALLBACK EnumResourceNameCallback(HMODULE hModule, LPCTSTR lpType,
LPWSTR lpName, LONG_PTR lParam)
{
HRSRC hResInfo = FindResource(hModule, lpName, lpType);
DWORD cbResource = SizeofResource(hModule, hResInfo);
HGLOBAL hResData = LoadResource(hModule, hResInfo);
const BYTE *pResource = (const BYTE *)LockResource(hResData);
TCHAR filename[MAX_PATH];
if (IS_INTRESOURCE(lpName))
_stprintf_s(filename, _T("#%d.manifest"), lpName);
else
_stprintf_s(filename, _T("%s.manifest"), lpName);
FILE *f = _tfopen(filename, _T("wb"));
fwrite(pResource, cbResource, 1, f);
fclose(f);
UnlockResource(hResData);
FreeResource(hResData);
return TRUE; // Keep going
}
int _tmain(int argc, _TCHAR* argv[])
{
const TCHAR *pszFileName = argv[0];
HMODULE hModule = LoadLibraryEx(pszFileName, NULL, LOAD_LIBRARY_AS_DATAFILE);
EnumResourceNames(hModule, RT_MANIFEST, EnumResourceNameCallback, NULL);
FreeLibrary(hModule);
return 0;
}
, С другой стороны, можно использовать MT.EXE из Windows SDK:
>mt -inputresource:dll_with_manifest.dll;#1 -out:extracted.manifest
Я думаю, что каталог в Все о монадах - хорошее начало (монада продолжения действительно полезна для катаморфизмов, см., Например, здесь ); дополнительно парсеры и, возможно, транзакционные эффекты . Async - еще один хороший вариант, который можно попробовать реализовать самостоятельно (логически-однопоточный код, который переключается между разными фактическими потоками, чтобы быть неблокирующим). И монада, лежащая в основе Reactive Framework , кажется хорошей сложной задачей.
Список структур данных / вычислений, которые следуют какому-то монадическому закону, чрезвычайно богат.
Он исходит из списков по необязательным данным ( 'опция
в F #) , продолжения и многопоточность вплоть до очень сложных вещей, таких как парсеры.
Просто начните реализовывать некоторые из них. Основные упражнения:
// Identity monad
let something = ident {
let! value = id 42
return value
}
let somethingelse = ident {
let! value = something
let! otherValues = id 40
return value + othervalue
}
// Implement maybe for 'a option
let sum = maybe {
let! a = maybeInputNumber("a")
let! b = maybeInputNumber("b")
let! c = maybeInputNumber("c")
return a + b + c
}
match sum with
| None -> ...
| Some(n) -> ...
Вы также можете улучшить свое понимание, играя немного с вспомогательными функциями и явным монадическим синтаксисом.
// Given m >>= f for m.Bind(f)
let (>-) f monad = monad >>= (fun k -> return(f x))
// What's this?
let res = ((+) 1) >- [1..10]
Если вам нужны сложные примеры, взгляните на комбинаторы монадического синтаксического анализатора . Это позволит вам реализовать сложные рекурсивные анализаторы спуска на простом F # (взгляните на FParsec -Project)
let parseVector = parser {
do! ignore $ char '('
let! [x;y;z] = sepBy parseNumber ","
do! ignore $ char ')'
return new Vector(x, y, z)
}
Простая реализация для этого основана на следующих типах:
type 't Computation =
| Error of ...
| Result of 't
type Input = char list
type 'a Parser = Input -> (('a * Input) Computation)
Попробуйте реализовать bind и return ; -)
И в качестве общего совета: если вы действительно хотите понять монады в их естественной среде, вам придется использовать Haskell ;-) В F # есть просто вычислительные выражения, просто расплывчатый аналог, но Haskell представляет общий интерфейс для любых монадических вычислений. Идеально, чтобы их попробовать!
Хотя я полагаю, что нет ничего сложного в том, что Haskell является естественным языком для изучения монад, я считаю, что очень полезным упражнением является перенос монадических вычислений на язык, который не прямо из коробки, имейте суперплавную поддержку в стиле Haskell. Это вполне возможно на любом языке, и на любом языке достаточно высокого уровня, вероятно, можно будет проявить творческий подход и действительно заставить их выглядеть красиво - многому научившись в процессе! Я видел классный монадический синтаксис для Python (я думаю, на Valued Lessons ), например.
Также есть библиотека Clojure clojure.contrib.monads, которая предоставляет хорошие возможности для использования монад в Лиспе. Попытка воссоздать его функционально может быть весьма поучительной. Также,