Micktu 😬
🐙 Antony
Жуть какая нечитабельная. Пользуйтесь http://www.boost.org/doc/libs/1_63_0/doc/html/boost_dll.html
void nf_nativeload(std::stack<MValue*>* stack) {
boost::dll::shared_library lib( // переменная должна сущестовать, пока пользуетесь функциями из библиотеки
((std::string*) stack->top()->castTo(MTYPE_STRING)->get())->c_str() // Что-то стрёмное
);
stack->pop();
int count = lib.get<int>("mlang_nativefunctions_count");
char** list = lib.get<char**>("mlang_nativefunctions_list");
for(int i = 0; i < count; i++) {
// ны вы поняли...
}
}
И ресурсы течь не будут. И под Windows работать будет
Surreal
shared_ptr на shared_library
Surreal
Ну блин, внутри программы же код, а не сингулярность какая-нибудь, уж время жизни объекта можно контролировать. В крайнем случае пихать шаред поинтер во все функции.
Алдар
man dlclose
Surreal
Там рефкаунт же.
Surreal
Вот кросс рефкаунт только фиг знает как работает.
🐙 Antony
тогда стоит линковаться напрямую к библиотеке
Александр
кстати, кто-нибудь знает разумный способ динамической подгрузки либ, но с предварительной их расшифровкой?
Александр
под линь
Micktu 😬
эээ
Micktu 😬
прочитал, расшифровал, сдампил на диск, загрузил
Александр
... с диска слили расшифрованную
Micktu 😬
значит, нет такого способа
Micktu 😬
успеют слить за несколько микросекунд думаешь?
Александр
я ищу что-то типа ld, но с возможностью грузить из памяти
Micktu 😬
никсы ж файлы не держат как винда
Micktu 😬
Александр
не подумал, что после загрузки стереть можно
Александр
хм
Micktu 😬
я как-то под виндой этим вопросом задавался, и это мрак
Micktu 😬
тоже только с диска
Micktu 😬
только винда и удалить не даст временный файл
Александр
то есть линукс позволит прогрузить в память, удалить исходный файл и всё будет ок? удивительно
Micktu 😬
да, линукс не запрещает удалять используемые файлы
Micktu 😬
можно хоть rm -rf / сделать
🐙 Antony
В заголовочном файле:
// Beware! Singlethreaded!!
void load_modules();
using function_type = void (параметры);
function_type get_function(string_view func_name);
// В cpp файле
namespace { namespce impl {
std::vector<boost::dll::shared_libraries> modules; // in cpp file
std::unordered_map<string_view, function_type> functions;
}}
void load_modules() {
// имплементация
for (auto& module_file: module_files) {
impl::modules.emplace_back(module_file);
}
// тут вместо list можно использовать boost::dll::library_info
// заполняем impl::functions
}
function_type get_function(string_view func_name) {
return impl::functions.at(func_name);
}
Александр
nativefunctions[(std::string) list[i]] = func; думаю, каст здесь лишний
Micktu 😬
я что-то такое и делал
Micktu 😬
и еще такм какие-то трюки с апи ntdll
Micktu 😬
и инъекцией прямо в IAP
Micktu 😬
но это было годы назад уже не ромню
Алдар
#url #coding_standards
https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=637
Anonymous
А у меня вопрос
Anonymous
Можно из функции вернуть лямбду?
Anonymous
Конечно. А ещё принимать в аргументы функции.
Anonymous
Сейчас скажу точно.
Anonymous
std::function<ReturnType (ArgType arg)> retFun() {
return [](ReturnType arg) { return variable; };
}
Anonymous
Окей
Alexey
Вопрос.. я уже туплю наверное, но.. почему я получаю
has no member named 'valid'
struct __attribute_(packed) foo {
Uint8 reserve:1,
pdsp_res:2,
mode:1,
cmp_irq:1,
req_irq:1,
suspend:1,
valid:1;
};
Alexey
обращение выглядит так:
volatile struct foo *bar;
// массив по адресу берем
bar = (volatile struct foo *)(MY_ADDR);
if ( bar[id].valid == test[id].param) { ... }
Anonymous
Так
Anonymous
Го фичу С++ которую я не знал
Alexey
выше смотри и скажи где баг-то)
Anonymous
Я в этом не шарю
Anonymous
Объясни мне код
Anonymous
С++17
Anonymous
Еее
Anonymous
Ни один компилятор не поддерживает наверное)
Anonymous
Конечно же работает только относительно контекста.
Не ну я думаю gcc скоро уже начнёт. Или может уже поддерживает.
Daniil
Anonymous
Нет.
Daniil
к
Anonymous
В 11 ввели лямбды. Там был захват объекта _по ссылке_
Daniil
и по указателю и по копии
Daniil
ну хз мб криво почитал
Anonymous
как бы это переменные
Daniil
хотя погоди
Anonymous
Разве по ссылке не круче чем копирование?
Daniil
я емнип прокидывал в лямбду std::shared_ptr
Anonymous
Для "оптимизации" - да
Anonymous
Понимаешь, если ты запускаешь ассинхронный таск как член класса содержащего данные то нет не круче
Anonymous
Это тупой пример но это первое что пришло в голову
Anonymous
Типа просто deal with it, есть контексты в которых было бы круто не копировать кучу переменных из класса а весь объект забрать с собой
Anonymous
Все его данные, если быть точнее. Создать копию. Не ебу пока как оно работает целиком.
Anonymous
Го еще фичу, я вообще никаких не знаю, так что можешь все подряд говорить
Anonymous
Никто наверное не ебёт))0)
Anonymous
Мммм, ты знаешь что такое RAII?
Daniil
Нет.
The [&] is a "capture list" specifying that local names used will be passed by reference. We could have said that we wanted to "capture" only v, we could have said so: [&v]. Had we wanted to pass v by value, we could have said so: [=v]. Capture nothing is [], capture all by references is [&], and capture all by value is [=].
http://www.stroustrup.com/C++11FAQ.html#lambda
Anonymous
Нит)
Anonymous
Если нет то тогда ты не знаешь ничего.
Anonymous
Хе
Anonymous
Александр
Anonymous
Anonymous
И ОНО НЕ КОПИРУЕТ ОБЪЕКТ, ЧТО ЗА ЕРЕСЬ
Александр
Раньше =, &, this - захватывали по ссылке. А для копирования нужно было [self = *this](..) { self.... };
Александр
Теперь вместо этого костыля *this