На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Как узнать тип переменной? , есть такое дело....
    Предположим есть переменная какого-то типа
    DWORD var;

    Как создать еще одну переменную такого же ти, как и эта переменная?(Разумеется предположим, что мы
    изначально не знаем что она DWORD)
    Что-то вроде в этом роде:

    (узнаем тип var ) NewVar=var;

    А вот как бы реализовать......

    зачем нужно? Вот есть темка "Универсальная функция для DLL" вот собственно к чему все.

    Help! С меня шоколадка (белая с орехами)
      может создать UNION
      а потом sizeof юзать и все ....
        Не зная всей поднаготной могу предложить такой вариант:
        ExpandedWrap disabled
           
          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;
          |

        Остальное сделает компилятор.
        Сообщение отредактировано: Flex_Ferrum -
          А вот как скажем имея назваеие типа в строке ("DWORD") получить переменную этого типа?

          "DWORD"----->> DWORD Var;

          (Предполагаем, что не знаем этого изначально, т.е. куча условий не подходит)

          ?????
            :)) Берешь, например, тип VARIANT и оперируешь уже им. Иначе (в твоем случае) никак.

            Добавлено в :
            С другой стороны - что значит "не знаем изначально"? Ты знаешь, какой метод из DLL хочешь позвать, и что ему хочешь передать. По этом ты можешь описать аргументы этого метода не строкой, а, например, параметром шаблона:
            ExpandedWrap disabled
               
              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);}
              };

            Есть техники, используя которые можно обойтись без цифевки после имени класса, но шестой студией они не поддерживаются.

            Добавлено в :
            Использование, соответственно:
            ExpandedWrap disabled
               
              HMODULE h = LoadLibrary("winsock2.dll");
              MyUniversalDllMethod3<SOCKET, int, int, int> socket(h, "socket");
              SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
              Не знаю, но по-моему можно так
              if(typeid(xxx)==typeid(int))
              {
              //генерим int
              }
              elseif(typeid(xxx)==typeid(double)
              {
              //генерим double
              }
              и т.д.
                Цитата
                lusims, 10.01.04, 16:32
                Не знаю, но по-моему можно так

                Можно, но зачем делать в runtime'е то, что можно сделать на этапе компиляции?
                  ОК! Всем Пасиб пребольшой!!!!
                  Типа вот шаблончик:

                  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);

                  Перегрузим такую родовую ф-цию - и вот универсальная ф-ция для ДЛЛ!
                    Есть пара небольших проблем:
                    1. Ты не можешь делать шаблоны с переменным числом параметров. Т. е. по-хорошему у тебя должны быть шаблоны CallFunction0, CallFunction1, CallFunction2 и т. п. для разного количества параметров, передаваемых функции.
                    2. VC60 имеет одно очень неприятное (в данном случае) отклонение от стандарта. Твой вариант не будет работать, если возвращаемый тип - void. Т. е. должны быть отдельные варианты шаблонов для возвращаемого значения типа void - CallVoidFunction0, CallVoidFunction1, CallVoidFunction2 и т. п..
                      А в чём собственно проблемма при вызове функции по её адресу.
                      Просто (address)(param1, param2, ..., param n) (перед этим описать функцию)
                      Ведь заранее же известно, какие параметры принимает функция.
                      А если кол-во параметров может быть различным, то надо __cdecl использовать.
                        Sanek, то, что предлагает Vchik, удобней.
                        Сообщение отредактировано: Flex_Ferrum -
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0391 ]   [ 16 queries used ]   [ Generated: 2.05.24, 10:27 GMT ]