Форум программистов, компьютерный форум, киберфорум
Наши страницы

Определение класса в DLL - ипользование вне и динамически - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Програмное включение и выключение монитора http://www.cyberforum.ru/cpp-beginners/thread505767.html
Как можно програмно включить/выключить монитор через windows? Как я понял, это делается с помощью сигналов верт./гориз. синхронизации. Я нашел следующую таблицу <TABLE cellSpacing=1 width=768...
C++ Алгоритм Цезаря Здраствуйте, я очень надеюсь что вы мне поможете! Мне нужно написать алгоритм шифрования и дешифрования Цезаря Алгоритм такой: Берем i-ый символ и заменяем его на i+{шаг}, где шаг... http://www.cyberforum.ru/cpp-beginners/thread505685.html
C++ Компонент для просмотра файлов и папок
Здравствуйте уважаемые участники форума! Мне необходим компонент для просмотра файлов и папок типа OpenDialog или SaveDialog. Компонент должен размещаться на форме (не как диалоговое окно). Какой...
Класс в отдельный файл C++
Подскажите, как сделать...вот есть у мня класс, как его сохранить, чтоб можно было использовать в других программах...и непосредственно, как использовать..?
C++ Пара вопросов о регионах http://www.cyberforum.ru/cpp-beginners/thread505143.html
1. они одинаково срабатывают и при SDI и Dialog ? 2. Куда надо засовывать вызов функции работающей с регионами? В конструктор класса диалога, в OnInitDialog()...
C++ Наложение изображений друг на друга Всё-таки как? Я вот смотрела функции класса CDC - PatBit,StretchBit,BitBit - в описании есть такие строки: BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc,... подробнее

Показать сообщение отдельно
bazile
63 / 39 / 20
Регистрация: 15.03.2007
Сообщений: 6,910
16.10.2006, 00:08
Я думаю что boombastik, bazile или messir вполне в состоянии были бы дать ответ на мой вопрос, или я ошибаюсь?
Я не считаю себя спецом по С++ и поэтому не стоит ожидать моих ответов в этом форуме. В данном же случае есть одна идея.
Код в DLL файле кроме класса должен содержать и одноименные функции из класса с дополнительный параметром указывающем на конкретный экземпляр (аналог this).
Код внутри DLL:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class DllObject
{
public:
    DllObject() { }
    void Say(LPCTSTR message) const
    {
        MessageBox(0, message, TEXT("My DLL"), MB_ICONINFORMATION | MB_OK);
    }
};
 
extern "C" __declspec(dllexport) DllObject* CreateObject()
{
    return new DllObject();
}
 
extern "C" __declspec(dllexport) void DestroyObject(DllObject* pimpl)
{
    if (pimpl)
    {
        delete pimpl;
    }
}
 
extern "C" __declspec(dllexport) void Say(DllObject* pimpl, LPCTSTR message)
{
    if (pimpl)
    {
        pimpl->Say(message);
    }
}
 
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    if (DLL_PROCESS_ATTACH == fdwReason)
    {
        DisableThreadLibraryCalls(hinstDLL);
    }
    return TRUE;
}
Функция CreateObject() создает объект и возвращает указатель на него. Этот указатель затем должен быть передан вызывающим кодом в функцию Say.
Код proxy класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class DllObjectProxy
{
private:
    // Запрет использования оператора присваивания и конструктора копирования
    DllObjectProxy(DllObjectProxy&) { }
    DllObjectProxy& operator=(DllObjectProxy&) { }
    typedef void* (*CREATE_OBJECT_PROC)();
    typedef void (*DESTROY_OBJECT_PROC)(void*);
    typedef void (*SAY_PROC)(void*, LPCTSTR);
    CREATE_OBJECT_PROC createObject_;
    DESTROY_OBJECT_PROC destroyObject_;
    HMODULE dllHandle_;
    void* pimpl_; // pointer to implementation
public:
    DllObjectProxy(LPCTSTR lpDllName);
    ~DllObjectProxy();
    void Say(LPCTSTR message) const;
};
 
DllObjectProxy::DllObjectProxy(LPCTSTR lpDllName)
{
    dllHandle_ = LoadLibrary(lpDllName);
    if (!dllHandle_)
    {
        // Ошибка загрузки DLL
        throw new ...;
    }
    createObject_  = reinterpret_cast<CREATE_OBJECT_PROC>(GetProcAddress(dllHandle_, "CreateObject"));
    destroyObject_ = reinterpret_cast<DESTROY_OBJECT_PROC>(GetProcAddress(dllHandle_, "DestroyObject"));
    if (!createObject_ || !destroyObject_)
    {
        // Нет функции создания/удаления класса
        // Неправильная DLL?
        FreeLibrary(dllHandle_);
        throw new ...;
 &
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru