Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Полное API, наверное, выглядит так:
LdrLockLoaderLock
LdrUnlockLoaderLock
LdrLockLoaderUnlock
LdrUnlockLoaderUnlock
LdrLockUnloaderLock
LdrUnlockUnloaderLock
LdrLockUnloaderUnlock
LdrUnlockUnloaderUnlock
Ловить дедлок в такой схеме, наверное, было бы равноценно потеряться в пятимерном пространстве.
Я тебя расстрою может, но GetProcAddress вызывает LdrLockLoaderLock и LdrUnlockLoaderLock. И не очень пони зачем Library написал, код выше делает также, только средствами стд
Мне похуй, если честно. Я ведь ещё и либу ищу, рефаю и дерефаю на каждый чих (так что есть вероятность, что не 3, а все 5). А раз лок реентерабельный - так оно ещё и работать будет 😉
Ну почему. На работе нужна была такая либа одно время, но её не было, поэтому наговнокодили с тайпдефами... А тут в c++11 такая няшнота получается - ни одной лишней строчки.
Прога должна была увидеть свет пару лет назад. Проект изначально разрабатывался на AutoIt, потом был переписан на PureBasic и наконец на Delphi. Затем я взялся переписывать код на FreePascal, чтобы прогу можно было безбоязненно распространять, но встретил на пути слишком много препятствий.
Нет, это не фейк. Я приложил максимум усилий, чтобы сделать прогу устойчивой и полезной. Прога отлаживалась с fastmm, и до сих пор работает под этим ММ. Никакой функциональщины, одно слошное ООП.
Прошу добавить туда оффлайн-режим с возможностью поиска по ГК и отображения удалённых постов (не зря ж я их качал). Ну или писать программу так, чтобы потом можно было добавить.
А ты участвовать в разработке не будешь, пельмень?
Чет мне кажется что наш уютненький не поддерживает нормального апи так что придётся парсить хтмл ручками
#### Important ###
Since this app is more a pilot study than a real product I worked on Tampermonkey for Dolphin browser quite a while and found recently the time to bring it into a beta state. You can get it from here: https://play.google.com/store/apps/details?id=net.tampermonkey.dolphin
учитывая, что ему ещё и браузер особенный нужен...
ЗАТО БЕСПЛАТНО!
А нафига она в декларативном описании? Проверка будет запрятана в Function и Library (кидаем исключение, если не нашли функцию или либа не загрузилась). Либо будет непосредственно перед вызовом if (somelib.somefunc) somelib.somefunc(...).
ну ты как бы сверху и привел часть их реализации. GetProcAddr() без проверки возврата непредсказуемая штука.
ЗЫ по моему опыту такой syntax sugar только частично помогает. грабли наступают тогда когда в разных версиях виндов у функций аргументы (и/или их типы) меняются. и версию виндов надо динамичски проверять...
в не-прикладухе - системщина, встроенщина, сетевуха - там народ (например я) предпочитает явный стиль работы с системой, и библиотеки только по нужде используются (SOUP).
только в прикладухе народ усиленно страдает "не хочу ничего про систему слышать и видеть, лучше еще какую библиотечку качнуть".
либа решает виндово-специфические проблемы. на каком линухе класс проблем "недокументированые функции кернела и трахания с их вызовом" просто отсутствует. (все что нужно есть в хидерах, а новые фишки можно вызвать с помощью syscall() макро из libc.)
а если это какой плагиновый интерфейс, то есть более простые способы доступа, нежели чем куча GetProcAddr()/dlsym().
как и в официальных хидерах? две инстанции на *A() и на *W(). плюс референс указывающий на одну из них, в зависимости от `UNICODE` (или как там дефайн нынче называется).
Кресты же. SetCurrentDirectory(char*), SetCurrentDirectory(wchar_t), нужную перегрузку выберет компилятор.
Я бы вообще предпочел загрузить только юникодную функцию и перегонять в неё из utf8.
Мне вот такой вариант нравится - добавить в описание функций флажок required.
Если required и не нашлась функция или либа - кидаем исключение сразу.
Если не required и не нашлась - кидаем исключение при вызове оператором (). Можно проверить оператором bool(), чтобы понять, есть ли эта функция в данной версии либы.
Да не надо расставлять ловлю исключений. Всегда можно посмотреть, загрузилась ли функция (operator bool). А если функции нет, но код этого не учитывает и всё равно дергает operator () - это самая настоящая исключительная ситуация, в которой не грех вбросить исключение (если его тут не бросить - один хуй segfault всё распидорасит.
А если флаг required установлен - то исключение вылетит в момент конструирования, где его несложно поймать (или не ловить).
Ну и в случаях, когда надо выбрать функцию в зависимости от версии - делаем враппер как в >>286917 и кидаем исключение из конструктора, если не нашлось никаких кандидатов.
Возможно, просто не осталось интересных тем для разговоров.
Появление комментариев на ГК подобно испарению/кристаллизации. Нужен какой-то центр, вокруг которого начнёт расти кристалл дискуссии. Ну или, если сравнивать с испарением, центр парообразования дискуссии.
В выходные посетители обычно уходят с работы и не участвуют в обсуждениях, на ГК остаются только школьники, с этим ничего не поделать. А вот если календарь не показывает никаких праздников, надо начинать флудить и троллить, а не просто периодически обновлять сток, ведь все обновляют сток и не пишут комментарии, если им не на что ответить.
Можно сесть на окно с телефоном/планшетом, завернуться в плед, кодить на жабе (только главное - не разлить и не обжечься исключениями) и с грустным лицом обновлять сток.
А как её вызывать-то надо, если сигнатура - параметр шаблона? Или там на самом деле требуется лишь наличие оператора () с определёнными параметрами, а шаблон нужен лишь чтобы можно было пихать и функции, и лямбды, и std::function?
Причём именно принимающий void* и возращающий void?
> (HMODULE)h
Забавно, везде такие шаблоны модные, а при использовании всё равно сишный говнокаст писать.
> принимающий void*
Если точнее - T*, где T* - что-нибудь, во что может кастануться указатель на первый аргумент. Насчёт возврата void - х.з., должен проканать и не void, просто заигнорит результат.
В общем это функция, которую unique_ptr будет вызывать для освобождения указателя.
> сишный говнокаст
Причём этот HMODULE и есть void *, емнип.
http://pastebin.com/fsEZ3Avr
Как хорошо быть Си мастер рейс.
Кем и почему? ну и лучше unique_ptr<void, void(*)(void*)>
Yo dawg
Полное API, наверное, выглядит так:
LdrLockLoaderLock
LdrUnlockLoaderLock
LdrLockLoaderUnlock
LdrUnlockLoaderUnlock
LdrLockUnloaderLock
LdrUnlockUnloaderLock
LdrLockUnloaderUnlock
LdrUnlockUnloaderUnlock
Ловить дедлок в такой схеме, наверное, было бы равноценно потеряться в пятимерном пространстве.
А этот лок нереентерабельный?
И при этом выглядит как ёбаный пиздец, угу. Моё Library по крайней мере хоть какие-то зайчатки инкапсуляции и удобства показывает...
Тебя походу торкнули фигурные скобки
Пытаюсь юзерскипты поставить
Я даже прокси-чекер накомпелял, но девайся нет, тоска.
http://implement.do.am/Images/6545435345.png
Прога должна была увидеть свет пару лет назад. Проект изначально разрабатывался на AutoIt, потом был переписан на PureBasic и наконец на Delphi. Затем я взялся переписывать код на FreePascal, чтобы прогу можно было безбоязненно распространять, но встретил на пути слишком много препятствий.
Чет мне кажется что наш уютненький не поддерживает нормального апи так что придётся парсить хтмл ручками
Креститься надо. Само собой не поддерживает... Но, с другой стороны, тут няшный xhtml, который вполне жрётся xml парсерами.
В любом случае сейчас у меня предсессия, потоп в конце июня сессия, так что пока запишу в хотели, если не обленюсь буду летом пилить
Где здесь пропущена запятая?
Других ошибок нет
Мда. Главное - сделать парсилку потоньше, а то вдруг API добавят.
Имхо, вреда от API не будет - все, кто хотел, уже ботов написали.
Василий, подробнее
Бля а я то все думал, что это все тот же чел, только после обострения.
ШОК за Семена в ГК срал его злой брат близнец. [u]Смотреть онлайн (Только для владельцев платных аккаунтов)[u]
Безумие, да?)
Since this app is more a pilot study than a real product I worked on Tampermonkey for Dolphin browser quite a while and found recently the time to bring it into a beta state. You can get it from here:
https://play.google.com/store/apps/details?id=net.tampermonkey.dolphin
учитывая, что ему ещё и браузер особенный нужен...
ЗАТО БЕСПЛАТНО!
может мозилка и грейсманки под ведром смогут?
потому что ты обработку ошибок забыл.
ну ты как бы сверху и привел часть их реализации. GetProcAddr() без проверки возврата непредсказуемая штука.
ЗЫ по моему опыту такой syntax sugar только частично помогает. грабли наступают тогда когда в разных версиях виндов у функций аргументы (и/или их типы) меняются. и версию виндов надо динамичски проверять...
А насчёт разных аргументов можно вот так попробовать (искуственный пример):
только в прикладухе народ усиленно страдает "не хочу ничего про систему слышать и видеть, лучше еще какую библиотечку качнуть".
либа решает виндово-специфические проблемы. на каком линухе класс проблем "недокументированые функции кернела и трахания с их вызовом" просто отсутствует. (все что нужно есть в хидерах, а новые фишки можно вызвать с помощью syscall() макро из libc.)
а если это какой плагиновый интерфейс, то есть более простые способы доступа, нежели чем куча GetProcAddr()/dlsym().
Перегрузкой оператора() выберется нужная версия SetCurrentDirectory
Я бы вообще предпочел загрузить только юникодную функцию и перегонять в неё из utf8.
Если required и не нашлась функция или либа - кидаем исключение сразу.
Если не required и не нашлась - кидаем исключение при вызове оператором (). Можно проверить оператором bool(), чтобы понять, есть ли эта функция в данной версии либы.
А то ведь везде где вызываешь расставлять ловлю исключений на тот случай если не загрузилась функция - та ещё упоротость
А если флаг required установлен - то исключение вылетит в момент конструирования, где его несложно поймать (или не ловить).
Как-то так я себе это представлял 😉
Распидорашу, если ещё раз меня так назовёшь.
Кстати, почему ты и Тарас так любите меня называть хуем?
Появление комментариев на ГК подобно испарению/кристаллизации. Нужен какой-то центр, вокруг которого начнёт расти кристалл дискуссии. Ну или, если сравнивать с испарением, центр парообразования дискуссии.
В выходные посетители обычно уходят с работы и не участвуют в обсуждениях, на ГК остаются только школьники, с этим ничего не поделать. А вот если календарь не показывает никаких праздников, надо начинать флудить и троллить, а не просто периодически обновлять сток, ведь все обновляют сток и не пишут комментарии, если им не на что ответить.
P.S. Код не taras-safe, слишком длинные строки.
LoadLibrary("NTDLL.DLL"),
[](void* h){if (h)FreeLibrary((HMODULE)h);</span> }
};
> шаблон нужен лишь чтобы можно было пихать и функции, и лямбды, и std::function
И даже аллаха, если у него есть operator ().
> (HMODULE)h
Забавно, везде такие шаблоны модные, а при использовании всё равно сишный говнокаст писать.
Если точнее - T*, где T* - что-нибудь, во что может кастануться указатель на первый аргумент. Насчёт возврата void - х.з., должен проканать и не void, просто заигнорит результат.
В общем это функция, которую unique_ptr будет вызывать для освобождения указателя.
> сишный говнокаст
Причём этот HMODULE и есть void *, емнип.
Мне? 🙂 Не надо мне приписывать код ОП'а...
fxd