Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вызов методов класса из dll 
V
    Опции темы
guram
Дата 3.6.2009, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 21.6.2007
Где: Киев

Репутация: нет
Всего: нет



Здравствуйте,

Мне в наследсство достались исходники dll.
Исходники представляют из себя набор классов, некоторые методы которых експортируются в dll

Несколько важных, на мой взгляд моментов:
.h файл
Код

...
#define DllExport   __declspec( dllexport )
...
class Protocol  
{
    ...
    public:
    DllExport BOOL InitCOM(int, int);
    ...
}


.cpp файл
Код

DllExport BOOL Protocol::InitCOM(int COMi,int iTo)
{
    ....
}


После сборки, просмотрщиком окрываю dll и в списке функци вижу следующее:
public: int __thiscall Protocol::InitCOM(int, int)

Скажите пожалуйста, а вот как теперь этот метод мне вызвать из приложения, которое делается при помосчи C++ Builder?

Спасибо!


Это сообщение отредактировал(а) guram - 3.6.2009, 15:51
PM MAIL ICQ   Вверх
andrew_121
Дата 3.6.2009, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



guram, Экспортировать нужно класс, а не его методы.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
guram
Дата 3.6.2009, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 21.6.2007
Где: Киев

Репутация: нет
Всего: нет



А Вы бв не могли привести пример, пожалуйста.

Но также вопрос остается, а каким образом работать с классом из приложения написанном при помощи C++Builder.

Спасибо!
PM MAIL ICQ   Вверх
jonie
Дата 3.6.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



пример в аттаче.
только переименуйте расширение на 7z.
Цитата
guram, Экспортировать нужно класс, а не его методы.

вам наврали.
вот что у меня борманд сгенил (builder6):
Код
═Ordinal  Offset  Name═══════════════════════
     1  .00401250 @AAA@InitCOM$qii
     2  .004020F8 ___CPPdebugHook
═════════════════════════════════════════════



Это сообщение отредактировал(а) jonie - 3.6.2009, 19:35

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  bormand.7z.doc 14,76 Kb


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
jonie
Дата 3.6.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



-дубль*

Это сообщение отредактировал(а) jonie - 3.6.2009, 19:33


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
xvr
Дата 4.6.2009, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Если сама dll собиралась в Borland, то нужно в исходниках 
Код

#define DllExport   __declspec( dllexport )
поменять на 
Код

#define DllExport   __declspec( dllimport )
(обычно это делают автоматом с помощью препроцессора)
Потом компилировать с приложением, а на этапе линковки дать ему import library (ее можно сделать из самой dll с помощью утилиты implib, или взять то, что получится в процессе cборки dll, IMHO Borland ее делает)

Если dll делалась не Borland (например VS), то никак - у них объектная структура разная

Можно сделать COM объект (сервер), тогда будет работать где угодно

PM MAIL   Вверх
guram
Дата 4.6.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 21.6.2007
Где: Киев

Репутация: нет
Всего: нет



Библиотека собиралась не в Borland а в VS.
Приложение, которое будет использовать библиотеку планировалось разработывать при помощи Borland.

Можно услышать ваше мение по поводу следующего:

В хедере dll,  где обявлены классы описать функцию
Код

extern "C" 
{
     DllExport int InitCOMPort(int iCOM, int iTO)
     {
     Protocol theApp;
     return theApp.InitCOM(iCOM, iTO);                 
     }
}


В таком случаи, библиотека подключается при помощи
Код

String sPath = ExtractFilePath(Application->ExeName)+ "myTLib.dll";
hDll=LoadLibrary(sPath.c_str());
pInit=(int (__stdcall *)(int,int))GetProcAddress(hDll,"InitCOMPort");


Но правильно ли это?

Спасибо!

Это сообщение отредактировал(а) guram - 4.6.2009, 13:46
PM MAIL ICQ   Вверх
math64
Дата 4.6.2009, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



В dll нужно добавить:
Код

// Visual C++
extern "C" 
{
     DllExport void* NewApp() { return (void*)new Protocol; }
     DllExport void DeleteApp(void* app) { delete (Protocol*)app; }
     DllExport int InitCOMPort(void* app, int iCOM, int iTO)
     {
     Protocol* theApp = (Protocol*)app;
     return theApp->InitCOM(iCOM, iTO);                 
     }

}

В Borland можно испльзовать через библиотеку импорта, созданную implib или LoadLibrary().
Но гарантии что будет работать нет (могут быть конфликты стандартных библиотек Borland C++ и Visual C++).
Память выделенная в dll должна удалаться в dll
Файл открытый в dll должен читаться, писаться и закрвываться в dll
и т.д.
PM   Вверх
xvr
Дата 4.6.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(guram @ 4.6.2009,  13:38)
Библиотека собиралась не в Borland а в VS.
Приложение, которое будет использовать библиотеку планировалось разработывать при помощи Borland.

Готовтесь к многочисленным граблям  smile RTL у Borland и VC разные, проблема усугубляется тем, что несмотря на то, что они разные, имена у подавляющего большинства стандартных функций одинаковые. Вместе это не живет, были попытки использовать dll от VC (простую, не объектно ориентированную) в Borland, все завершилось всеобщим крахом где то в потрохах непонятно чьего рантайма  smile 
PM MAIL   Вверх
guram
Дата 4.6.2009, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 21.6.2007
Где: Киев

Репутация: нет
Всего: нет



Пытаюсь использовать функции по указанному алгоритму:

Код

    
    void* (__stdcall *NewApp)();  // pointet to NewApp function
    void* app; // will be returned by NewApp
    int (__stdcall *pInit)(void*,int,int);

    String sPath = ExtractFilePath(Application->ExeName)+ "myLib.dll"; // path to dll
    HINSTANCE hDll=LoadLibrary(sPath.c_str()); // instance of dll
    if (hDll){
        printLog("Dll has been loaded");

        NewApp = (void* (__stdcall *)())GetProcAddress(hDll,"NewApp");
        if (NewApp){
            printLog("NewApp has been loaded");
            app = NewApp();

            pInit=(int (__stdcall *)(void*,int,int))GetProcAddress(hDll,"InitCOMPort");
            if (pInit){
                printLog("InitComPort has been loaded");
                if (pInit(app, 1, 10)){
                    printLog("COM1 was initialize");
                } else {
                    printLog("COM1 initialization ERROR");
                }
            } else {
                printLog("InitComPort function loading error");
            }
        } else {
            printLog("NewApp function loading error");
        }
        FreeLibrary(hDll); // rree memory
    } else {
        printLog("Loading dll ERROR");
    }



Но так и не получаю корректного ответа.

Бвть может ошибаюсь где-то.

Зарание огромное спасибо!
PM MAIL ICQ   Вверх
jonie
Дата 4.6.2009, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



пример в аттаче.
обратите внимание на наличие файла def в проекте и отсуствие DLLEXPORT директив в адаптере. __declsprec(dllexport) + extern "c" создают несколько иную именуую структуру (во первых это подчеркивание перед экспортируемыми символами, во вторых через @ прописан размер параметров в байтах).

Это сообщение отредактировал(а) jonie - 4.6.2009, 18:53

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  VS2Bormand.7z.doc 30,65 Kb


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
guram
Дата 9.6.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 21.6.2007
Где: Киев

Репутация: нет
Всего: нет



jonie, спасибо Вам.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0569 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.