Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.221.187.121] |
|
Сообщ.
#1
,
|
|
|
Предположим есть переменная какого-то типа
DWORD var; Как создать еще одну переменную такого же ти, как и эта переменная?(Разумеется предположим, что мы изначально не знаем что она DWORD) Что-то вроде в этом роде: (узнаем тип var ) NewVar=var; А вот как бы реализовать...... зачем нужно? Вот есть темка "Универсальная функция для DLL" вот собственно к чему все. Help! С меня шоколадка (белая с орехами) |
Сообщ.
#2
,
|
|
|
может создать UNION
а потом sizeof юзать и все .... |
Сообщ.
#3
,
|
|
|
Не зная всей поднаготной могу предложить такой вариант:
template<typename T> struct VariantValue_t { T m_Value; }; template<typename T> VariantValue_t<T> VariantValue(T val) { VariantValue_t<T> ret_val; ret_val.m_Value = val; return ret_val; | Остальное сделает компилятор. |
Сообщ.
#4
,
|
|
|
А вот как скажем имея назваеие типа в строке ("DWORD") получить переменную этого типа?
"DWORD"----->> DWORD Var; (Предполагаем, что не знаем этого изначально, т.е. куча условий не подходит) ????? |
Сообщ.
#5
,
|
|
|
) Берешь, например, тип VARIANT и оперируешь уже им. Иначе (в твоем случае) никак.
Добавлено в : С другой стороны - что значит "не знаем изначально"? Ты знаешь, какой метод из DLL хочешь позвать, и что ему хочешь передать. По этом ты можешь описать аргументы этого метода не строкой, а, например, параметром шаблона: template<R, T1, T2, T3> class MyUniversalDllMethod3 { public: MyUniversalDllMethod3(HMODULE, const char* name) {// инициализируем указатель на метод из длл;} R operator()(T1 p1, T2 p2, T3 p3) {return m_pMethod(p1, p2, p3);} }; Есть техники, используя которые можно обойтись без цифевки после имени класса, но шестой студией они не поддерживаются. Добавлено в : Использование, соответственно: HMODULE h = LoadLibrary("winsock2.dll"); MyUniversalDllMethod3<SOCKET, int, int, int> socket(h, "socket"); SOCKET sock = socket(AF_INET, SOCK_STREAM, 0); |
Сообщ.
#6
,
|
|
|
Не знаю, но по-моему можно так
if(typeid(xxx)==typeid(int)) { //генерим int } elseif(typeid(xxx)==typeid(double) { //генерим double } и т.д. |
Сообщ.
#7
,
|
|
|
Цитата lusims, 10.01.04, 16:32 Не знаю, но по-моему можно так Можно, но зачем делать в runtime'е то, что можно сделать на этапе компиляции? |
Сообщ.
#8
,
|
|
|
ОК! Всем Пасиб пребольшой!!!!
Типа вот шаблончик: template<class R,class T1, class T2,class T3,class T4> R CallFunction(char* dll,char* funcname,T1 first,T2 second,T3 third,T4 fourth){ R(WINAPI *funct)(T1,T2,T3,T4); HINSTANCE h = LoadLibrary(dll); if (!h)return (NULL); if((funct=(R (WINAPI *)(T1,T2,T3,T4))GetProcAddress(h,funcname))==NULL)return(NULL); return(funct( first, second, third, fourth)); } Итак: CallFunction<int>("user32.dll","MeesageBoxA",NULL,"forever","Sources-",MB_OK); Перегрузим такую родовую ф-цию - и вот универсальная ф-ция для ДЛЛ! |
Сообщ.
#9
,
|
|
|
Есть пара небольших проблем:
1. Ты не можешь делать шаблоны с переменным числом параметров. Т. е. по-хорошему у тебя должны быть шаблоны CallFunction0, CallFunction1, CallFunction2 и т. п. для разного количества параметров, передаваемых функции. 2. VC60 имеет одно очень неприятное (в данном случае) отклонение от стандарта. Твой вариант не будет работать, если возвращаемый тип - void. Т. е. должны быть отдельные варианты шаблонов для возвращаемого значения типа void - CallVoidFunction0, CallVoidFunction1, CallVoidFunction2 и т. п.. |
Сообщ.
#10
,
|
|
|
А в чём собственно проблемма при вызове функции по её адресу.
Просто (address)(param1, param2, ..., param n) (перед этим описать функцию) Ведь заранее же известно, какие параметры принимает функция. А если кол-во параметров может быть различным, то надо __cdecl использовать. |
Сообщ.
#11
,
|
|
|
Sanek, то, что предлагает Vchik, удобней.
|