Я решил просто заставить плагины принимать простой интерфейс:
DWORD func ( LPARAM pBuf, DWORD size );
Это позволило бы пользователю указать свои параметры в XML, а затем определить структуру, которую они ожидают от меня, например,
typedef struct
{
int a;
float b;
double c;
wchar_t * d;
} test1;
Когда они получают это сообщение от меня, они могут проверить размер перед использованием буфера, чтобы убедиться, что XML и структура совпадают.
Когда я анализирую XML, я использую этот класс с шаблонными методами для динамического конструирования объекта:
class DynamicStructure
{
public:
template <typename T>
void addField(const T & field)
{
m_mapPtrSize.push_back(std::make_pair(reinterpret_cast<const LPARAM>(&field), sizeof(T)));
}
DWORD getSize()
{
//
// Work out the combined size of all the fields
DWORD sSize = 0;
for ( auto it = m_mapPtrSize.cbegin(); it != m_mapPtrSize.cend(); it++ )
{
sSize += it->second;
}
return sSize;
}
LPARAM getBuffer()
{
// Create a buffer big enough for all the fields
//
LPARAM pBuf = reinterpret_cast<LPARAM> (new (std::nothrow) BYTE[getSize()]);
if (pBuf == NULL)
return NULL;
DWORD offset = 0;
for ( auto it = m_mapPtrSize.cbegin(); it != m_mapPtrSize.cend(); it++ )
{
// Copy the fields one at a time, offsetting into the buffer
//
memcpy( (void*) (pBuf + offset), (const void*) it->first, it->second);
offset += it->second;
}
return pBuf;
}
protected:
private:
std::vector<std::pair<const LPARAM, DWORD>> m_mapPtrSize;
};
Это позволяет мне выполнять следующие операции при разборе XML:
DynamicStructure dynStruct;
int a = 1;
float b = 2.3f;
double c = 3.5;
wchar_t * d = L"bob";
dynStruct.addField(a);
dynStruct.addField(b);
dynStruct.addField(c);
dynStruct.addField(d);
// Test - does the dymanic structure match the user's structure?
LPARAM pBuf = dynStruct.getBuffer();
test1 * pTest1 = (test1 *) pBuf;
std::wcout << pTest1->a << " " << pTest1->b << " " << pTest1->c << " " << pTest1->d << std::endl;
Это не идеально, и это немного старая школа, но, по крайней мере, это просто и обеспечивает разумный уровень безопасности.