1. C++ / Говнокод #16769

    +57

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    class C3D
    {
    public:
      //C3D()  {}  // Constructor
      //~C3D()  {}  // Destructor
    
      void(*init)(float R, float A, float B, float Rmin, float Rmax, float Bmin, float Bmax);  // Initialize work with 3D standard camera
      void(*setCamera)(int iType);  // Set type of camera
      void(*setPosition)(float x, float y, float z);  // Set position
      void(*setRender3D)();
      UINT(*addMesh)(LPCWSTR sMesh);  // Add Mesh
      void(*renderMesh)(UINT idMesh, float x, float y, float z);
      void(*renderMeshSubset)(UINT idMesh, UINT idSubset, float x, float y, float z);
      void(*renderMeshSubsetRotateX)(UINT idMesh, UINT idSubset, float x, float y, float z, float a);
    // простыня указателей на функции урезана
    
      void setHModule(HMODULE hLib)
      {
        m_hLib = hLib;
    
        (FARPROC &)init = GetProcAddress(m_hLib, "init3D");  // Initialize work with 3D standard camera
        (FARPROC &)setCamera = GetProcAddress(m_hLib, "setCamera");  // Set type of camera
        (FARPROC &)setPosition = GetProcAddress(m_hLib, "setPosition");  // Set position
        (FARPROC &)setRender3D = GetProcAddress(m_hLib, "setRender3D");
        (FARPROC &)addMesh = GetProcAddress(m_hLib, "addMesh");  // Add Mesh
        (FARPROC &)renderMesh = GetProcAddress(m_hLib, "renderMesh");
        (FARPROC &)renderMeshSubset = GetProcAddress(m_hLib, "renderMeshSubset");
        (FARPROC &)renderMeshSubsetRotateX = GetProcAddress(m_hLib, "renderMeshSubsetRotateX");
    // простыня GetProcAddress урезана
      }
    
    protected:
      HMODULE  m_hLib;  // NetWars.dll
    };

    Некий SDK для MMO-игр за авторством одного известного разработчика.

    Запостил: bazhenovc, 25 Сентября 2014

    Комментарии (50) RSS

    • А где гавно то в коде?
      Стандартный класс-обёртка для динамической работы с DLL.
      Ответить
      • показать все, что скрыто
              g@@@@@44444*********9444@@@@@@@@@@@Mggg__
        	       g@M"	    _an**"""""""**Vw=G______"%%@@@@@gg_
        	     ,@@`	 a^"  __a=~v-vvv~~,___	       _____`"*@gg_
        	    a@@       _M" _m*"` _______     `""""""""""`    "	"9@g_
        	    @@	    a" ,m"_ar*"'`     -,	 ,amv****-~,	   9@g
        	   @@	     .* u"		C	  ,~	    "\	     @
        	  d@	       '    __gg____		  `		     @y
        	 g@		,g@@@@@@@@4@@gg_	  C   ______	     9@g
               g@@.>~.	   __  a@""@@@@@@__  "9@g	  ,g@@@@**4@@_	      "@g_
             g@"$-*"""	   *Y, @@@@*""**4@@@g__$@C     ggg@@@@@@@@@@*" "'" ""Mg`8@g
           g@",`  ,g@@@@@@@g_	    _g@     ""@M"      `"@@"		    *n_"C"@@
          g@'	 p@"	,`"@@@ggggg@@"			 8]	 ,_  _gM@@@@g ' 'C8@
          @@	j@     8@_    `"""'			 8@g_	 3@g@@@`,  `"	 ][@
          @L	8@  _g@@@@@gg_		    _gMMy	  "9@g_    `""' 8L	 j8@
          @k	3@ d@@@@   "@@@gg_   *""""" @"``___	    '@@g_	@@C  n"  Q@
          "@C $  9k    @@_    "8@@@@gg_     @g_fM4@@M	   g@""" "n.   a@@@  _m*3@"
           "@g N,      9@@gg_  8@ `""9@@@gg__"	       8gg@M	    _g@@@d@k   a@%
            "@@g_'	"@@@@@@@@g_	`"8@@@@ggg____  ""`   ___gg@@@@ 8@@@   @@
              "@g_	 '@g `"@@@@gg__   @L  `"""4@@@@@@@@@@@@@@@@"  @C @@@  3@
        	9@_	  `@g  3@"9@@@@@@g@	   [@	  @@	 4@y  @kg@@@  [@
        	 9@	    8@gd@   '"9@@@@@@@gggggd@gggggd@gggggg@W@@@@@@@@  [@
        	  8g	     "@@g	 @""9@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F  [@
        	   @g	       "@@g_	d@     '""@@@@@@@@@@@@@@@@@@@@@@@$@   3@
        	   `@g_		 "@@@g_j@'	  @C  ``"3@@"""8@""j@'j@g@@   3@
        	     9@g_ ~__ ~._  `"@@@@g_	  @C	 8@   g@^ p@^ "@@M     @C
        	       "@@g "9m_ "Nq_  "*@@@@ggggg@______@____@@gg@@@@@M"      @L
        		 "9@@g_`"Mm_`"Nq_   """"*4@@@@@@@@@@M@@4*"""'	       8k
        		    "9@@g_ ""Mm_"*w__	    ~~~~ aaa~~	      _/       $@
        		       `"@@gg_  "*WG_"*w~.____		___am*"    /   [@
        			   "*@@gg    `"*-~<.__	       `       __M"    3@
        			       "9@gg_	      `""'** ------**""`       d@
        				  `"@@ggggg__			     ,d@
        				      ""9@@@@@gg__		  __g@"
        					     `""*4@@@@MggggggggM@@@@"
        						     `""""""""""'
        Ответить
        • показать все, что скрыто
          g@@@@@44444*********9444@@@@@@@@@@@Mggg__
          	       g@M"	    _an**"""""""**Vw=G______"%%@@@@@gg_
          	     ,@@`	 a^"  __a=~v-vvv~~,___	       _____`"*@gg_
          	    a@@       _M" _m*"` _______     `""""""""""`    "	"9@g_
          	    @@	    a" ,m"_ar*"'`     -,	 ,amv****-~,	   9@g
          	   @@	     .* u"		C	  ,~	    "\	     @
          	  d@	       '    __gg____		  `		     @y
          	 g@		,g@@@@@@@@4@@gg_	  C   ______	     9@g
                 g@@.>~.	   __  a@""@@@@@@__  "9@g	  ,g@@@@**4@@_	      "@g_
               g@"$-*"""	   *Y, @@@@*""**4@@@g__$@C     ggg@@@@@@@@@@*" "'" ""Mg`8@g
             g@",`  ,g@@@@@@@g_	    _g@     ""@M"      `"@@"		    *n_"C"@@
            g@'	 p@"	,`"@@@ggggg@@"			 8]	 ,_  _gM@@@@g ' 'C8@
            @@	j@     8@_    `"""'			 8@g_	 3@g@@@`,  `"	 ][@
            @L	8@  _g@@@@@gg_		    _gMMy	  "9@g_    `""' 8L	 j8@
            @k	3@ d@@@@   "@@@gg_   *""""" @"``___	    '@@g_	@@C  n"  Q@
            "@C $  9k    @@_    "8@@@@gg_     @g_fM4@@M	   g@""" "n.   a@@@  _m*3@"
             "@g N,      9@@gg_  8@ `""9@@@gg__"	       8gg@M	    _g@@@d@k   a@%
              "@@g_'	"@@@@@@@@g_	`"8@@@@ggg____  ""`   ___gg@@@@ 8@@@   @@
                "@g_	 '@g `"@@@@gg__   @L  `"""4@@@@@@@@@@@@@@@@"  @C @@@  3@
          	9@_	  `@g  3@"9@@@@@@g@	   [@	  @@	 4@y  @kg@@@  [@
          	 9@	    8@gd@   '"9@@@@@@@gggggd@gggggd@gggggg@W@@@@@@@@  [@
          	  8g	     "@@g	 @""9@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F  [@
          	   @g	       "@@g_	d@     '""@@@@@@@@@@@@@@@@@@@@@@@$@   3@
          	   `@g_		 "@@@g_j@'	  @C  ``"3@@"""8@""j@'j@g@@   3@
          	     9@g_ ~__ ~._  `"@@@@g_	  @C	 8@   g@^ p@^ "@@M     @C
          	       "@@g "9m_ "Nq_  "*@@@@ggggg@______@____@@gg@@@@@M"      @L
          		 "9@@g_`"Mm_`"Nq_   """"*4@@@@@@@@@@M@@4*"""'	       8k
          		    "9@@g_ ""Mm_"*w__	    ~~~~ aaa~~	      _/       $@
          		       `"@@gg_  "*WG_"*w~.____		___am*"    /   [@
          			   "*@@gg    `"*-~<.__	       `       __M"    3@
          			       "9@gg_	      `""'** ------**""`       d@
          				  `"@@ggggg__			     ,d@
          				      ""9@@@@@gg__		  __g@"
          					     `""*4@@@@MggggggggM@@@@"
          						     `""""""""""'
          Ответить
          • Зачем постишь изображение в чрезстрочной развертке? Сделай деинтерлейс.
            Ответить
    • Похоже на жабий JNA.
      А вообще прям красиво с загрузкой модулей сложно сделать.
      Ответить
    • >> А где гавно то в коде?
      +100500, тоже не нашёл говна в коде.
      Аффтар похоже обожрался и заснул где-то на вокзале в выгребной яме, и ему теперь везде говно мерещится.
      Ответить
    • может говно в том, что у этого известного разработчика куда-то пропал хедер от этой либы
      Ответить
      • Да нету тут говна. Когда хочется либу грузить динамически и опционально - по другому никак.

        Хедеры тут ничем не помогут.
        Ответить
        • Ну разве что мы не знаем, зачем хранить защищённое поле m_hLib (есть ли другие методы для работы с ним) и какой код инициализирует параметр hLib.
          Ответить
    • Наверняка эти обертки генерятся, а не пишутся. Так что тут можно поругать только язык/систему/API, а не автора.
      Ответить
    • --- Аффтар похоже обожрался и заснул где-то на вокзале в выгребной яме, и ему теперь везде говно мерещится.
      Скорее всего, аффтар просто школотодебил и не слышал ничего про динамическую работу с ДЛЛ, у него мозгов не хватает разобраться, что это за код, и он ставит ярлык - говно.
      Ответить
      • Сделано топорно. Ни один результат GetProcAddress не проверяется на ноль. thiscall не нужен. Неявные соглашения о вызове.
        Ответить
    • Почему же, говном можно назвать не кросс-платформеннсть. В коде не видно, что этот класс используется как бекенд в Шіndows и что существует класс с аналогичным интерфейсом и (например) dlopen/dlsym внутри
      Ответить
      • Не надо в линухе ММОРПГ... И так уже кучу игрушек натащили. А когда-то была система для работы...
        Ответить
        • Всегда есть для работы FreeBSD.
          Ответить
          • Унылый комментарий удалён.
            Ответить
          • Да, только во FreeBSD вроди есть POSIX и OpenGL. Даже дрова проприетарные от невидиа.
            Ответить
            • POSIX есть, OpenGL не знаю. Железный мир не ограничен одной нвидеей и дрова под freebsd не подо всё есть, что то с линухов портируется.
              Ответить
        • > Не надо в линухе ММОРПГ...
          Будь силён духом, и никакая ММОРПГ тебя не зацепит.
          Ответить
          • Да меня и так только haven & hearth надолго цеплял (что характерно, пашет и под линухой)... Остальные ММО жили пару-тройку дней.
            Ответить
        • >Не надо в линухе ММОРПГ...
          Хотел бы чтобы вы сделали игру, MMORPG суть такова... Пользователь может репорить баги, писать код, запилить свой проект или стать великодушным диктатором. И если пользователь пишет код, то он отправляет патчи, багзиллы набигают программисты и тролли. Можно запилить что-то полезное.
          P.S. Я джва года хочу такую игру.
          Ответить
      • Ты никак DirectX 11 на линуксе собрался запускать?
        Ответить
        • Кстати, а чего новенького и интересного Direct 3d из комплекта DirectX 11 предлагает? Всяко же там есть что-то, чего нету в последних OpenGL, даже с вендорскими расширениями?
          Ответить
          • Вычисления на GPU вроде.

            А вот в DX12 и новом OGL обещают сильно снизить оверхед на передачу данных между процом и видео.
            Так как мне проплатила амд, то они долго делали штуку называющуюся Mantle плюс единое адресное пространство и zero-cost mem copy .
            Ответить
          • Да, поддержка кроссплатформенности с Xbox One и PS4
            Ответить
        • > DirectX 11
          Еще один пункт не кросс-платформенности
          Ответить
          • Как раз DirectX 11 - это единственно сейчас кроссплатформенное API, поддержка кроссплатформенности с Xbox One и PS4
            Ответить
            • А как же SDL?
              Ответить
              • На SDL ММОРПГ не пишут, оно только для новичков годится.
                Ответить
                • Тут принято такие тезисы отмечать зелёным.
                  Ответить
                  • Я от начальника заразился его шуточками, теперь сам не всегда могу понять троллю я или серьезно говорю.
                    Ответить
                    • > троллю я или серьезно говорю
                      В каждой шутке есть доля шутки.
                      Ответить
    • Говно в комментариях к коду.
      Ответить
    • гавно. я таким в старые времена тоже страдал. а потом научился просто в либе одно из двух:

      - запихиваешь указатели на функции в глобальную структуру, экспортишь структуру

      - запихиваешь указатели на функции в глобальный массив, эспортишь массив

      потому что простыни GetProcAddress() - это говно. массив проще - но нельза типизировать. сгенерить автоматом структуру с правильно-типизироваными указателями сложнее - но в последствии меньше граблей.
      Ответить
      • Проблема в том, что либа вполне могла оказаться внешней, неподконтрольной им. И тогда остается только GetProcAddress, только хардкор.
        Ответить
        • Ой, не умничай.
          Ответить
        • к слову. это же винды.

          были в свое время тулзы implib(?) генерить по длл. потом делаешь хидер и юзашь как любую другую либу.
          Ответить
          • Да ну. Как можно сгенерить либу/хидер по dll? Там же инфа о типах потеряна. От функций одни имена остаются...
            Ответить
            • для либы не нужны типы - там лежит буквально список функций (или правильней: символов). в случае С++, типы уже есть часть mangled имени функции. все что implib делает, это говорит что такой-то символ должен братся из такой-то длл-ки.
              Ответить
            • Ida в зубы, и типы восстанавливаются. Как минимум до WORD/DWORD, а если посидеть и подумать, то и до вменяемых.
              Ответить
    • Сам так писал, с той лишь разницей что структура была инкапсулирована в сиглетон и возвращалась из ДЛЛ.
      Ответить

    Добавить комментарий