Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Програмное включение и выключение монитора http://www.cyberforum.ru/cpp-beginners/thread505767.html
Как можно програмно включить/выключить монитор через windows? Как я понял, это делается с помощью сигналов верт./гориз. синхронизации. Я нашел следующую таблицу <TABLE cellSpacing=1 width=768 border=1><TBODY><TR><TD vAlign=center width="13% <P align=center><B>Horiz</B></P></TD><TD vAlign=center width="13% <B><P align=center>Vert</B></P></TD><TD vAlign=center width="75% <B>...
C++ Алгоритм Цезаря Здраствуйте, я очень надеюсь что вы мне поможете! Мне нужно написать алгоритм шифрования и дешифрования Цезаря Алгоритм такой: Берем i-ый символ и заменяем его на i+{шаг}, где шаг постоянная величина например число 3. Буквы, выходящие за пределы алфавита, возвращаются к началу. Так, при сдвиге 3 букве z исходного текста соответствует буква с зашифрованного текста и т. д. http://www.cyberforum.ru/cpp-beginners/thread505685.html
C++ Компонент для просмотра файлов и папок
Здравствуйте уважаемые участники форума! Мне необходим компонент для просмотра файлов и папок типа OpenDialog или SaveDialog. Компонент должен размещаться на форме (не как диалоговое окно). Какой компоненет мне необходимо для этого использовать? Компоненты вкладки Win 3.1 мне нее подходят, ои выглядят не очень привлекательно. Компонент ShellListView более подходящий, но имеет два недостатка:...
Класс в отдельный файл 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, DWORD dwRop ); ... dwRop подробнее

Показать сообщение отдельно
bazile
58 / 34 / 20
Регистрация: 15.03.2007
Сообщений: 6,911
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 ...;
 &
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru