На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Вызов классов из dll
    Добрый вечер, решил перенести свой проект из Visual Studio 6.0 (да-да я ретроград :) ) в Visual Studio 2013. Возникла проблема следующего характера, у меня есть общая dll в которой находятся классы элементов управления производные от стандартных с расширенным функционалом. Не могу разобраться как их правильно объявить, чтобы использовать dll.
      Так же как и раньше. не совсем понятно что у тебя не получается.
        В 6-й студии сделано вот так:

        Объявление класса:
        ExpandedWrap disabled
          class AFX_EXT_CLASS CStaticEx : public CStatic
          {
          // Construction
          public:
              CStaticEx();
           
          // Attributes
          public:
              struct_static struct_st;
           
          // Operations
          public:
           
          // Overrides
              // ClassWizard generated virtual function overrides
              //{{AFX_VIRTUAL(CStaticEx)
              //}}AFX_VIRTUAL
           
          // Implementation
          public:
              virtual ~CStaticEx();


        Сам класс:

        ExpandedWrap disabled
          CStaticEx::CStaticEx()
          {
          }
           
          CStaticEx::~CStaticEx()
          {
          }


        Подключаю к своему проекту dll как обычно:
        ExpandedWrap disabled
          #pragma comment(lib,"common.lib")
          #include "common.h"


        И пользуюсь своими контролами
          Ну так у тебя в новом проекте поди не определен AFX_EXT_CLASS, который должен быть либо __declspec(dllexport) либо __declspec(dllimport)
          Ну и плюс, не
          ExpandedWrap disabled
                #pragma comment(lib,"common.lib")
                #include "common.h"

          А
          ExpandedWrap disabled
                #include "common.h"
             
                #pragma comment(lib,"common.lib")


          Добавлено
          Вот тут более подробно описано:
          https://msdn.microsoft.com/ru-ru/library/9xyb5w93.aspx

          Исходя из справки в MSDN, у тебя в DLL должен быть объявлен макрос:
          Цитата
          Библиотека MFC определяет макрос в качестве __declspec(dllexport), когда определяются символы предпроцессора _AFXDLL и _AFXEXT

          А в проекте, который использует DLL, должен быть объявлен только макрос - _AFXDLL
            Помогло только добавление __declspec(dllexport) в реализацию класса

            Добавлено
            Поторопился я, при компиляции проги пишет что не найдена точка входа в процедуру
              Цитата Sander @
              Помогло только добавление __declspec(dllexport) в реализацию класса

              Объявление этих макросов -> _AFXDLL и _AFXEXT как раз и добавляет __declspec(dllexport). Если просто объявишь макрос _AFXDLL - то будет __declspec(dllimport).
              Я думаю тебе нужно почитать литературу о том, как экспортируются/импортируются функции из DLL. Можешь начать например отсюда -> http://rsdn.org/article/baseserv/dlluse.xml?print

              Добавлено
              Если что, на всякий случай. Эти макросы нужно добавлять в опциях проекта DLL и приложения, которое использует DLL.
              В опциях проекта -> Project Properties->C/C++->Preprocessor->Preprocessor Definitions.
              Для проекта DLL нужно добавить туда _AFXDLL и _AFXEXT
              Для проекта, который использует DLL, нужно добавить туда _AFXDLL

              Добавлено
              Вот тут даже пример есть готовый: https://docs.microsoft.com/ru-ru/previous-v...ezhh3d(v=vs.90)
                Уважаемый Wound большое тебе спасибо! Со всем разобрался, тему можно закрывать.
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0794 ]   [ 16 queries used ]   [ Generated: 18.04.24, 06:26 GMT ]