Этот код предназначен для того чтобы избавить программиста от необходимости руками регестрировать юнит-тесты, фабрики классов, и т.п. глобальные обьекты и функции.
Регистрация осуществляется крайне просто:
1) заводим префикс для семейства обьектов, например my_prefix_
2) добавляем __declspec(dllexport) к обьекту.
__declspec(dllexport) void my_prefix_test_1()
{
// понеслась
}
// для удобства юзаем макросы
#define MY_TEST(name) __declspec(dllexport) void my_prefix_##name
MY_TEST(foo)()
{
// понеслась
}
Теперь прочитав таблицу экспорта в PE файле можно получить список нужных функций:
#include "stdafx.h"
#include "hacking.h" // <- здесь
const char *prefix = "?my_prefix_"; // образаем внимание на знак вопроса перед именем
typedef void (*Func)();
int main(int argc, char* argv[])
{
hacking::ImpEntry e;
int n = hacking::imp_table_size();
int prefix_len = strlen(prefix);
// вызываем все функции которые начинаются с my_prefix
for (int i = 0; i < n; i++ )
{
e = hacking::imp_table_at(i);
if ( strncmp( prefix, e.name, prefix_len) == 0 )
((Func)e.addr)(); // call
}
return 0;
}
Сырцы и примерчик
здесь