диалоговое окно в dll
От: ch_andr  
Дата: 08.04.08 17:29
Оценка:
__dll__
1. Мастером Microsoft Visual Studio 2005 создан MFC DLL "my_dll.dll" проект с поддержкой — Regular DLL using shared MFC DLL.
2. Мастером создан диалоговый ресурс
3. Мастером добавлен класс CDialog_my для созданного диалогового ресурса
4. В файл добавлена следующая функция для создания и открытия окна


extern "C" __declspec(dllexport) int MyInit(int i)
{
    CDialog_my MyDialog;//Обьект класса class CDialog_my : public CDialog
    MyDialog.DoModal();//Собственно создаем модальное окно
    return 1;
}



__exe__
1. Мастером Microsoft Visual Studio 2005 создан MFC Application проект типа Dialog based.
2. Добавлена кнопка
3. Обрабатываем нажатие

void CexeDlg::OnBnClickedButton1()
{
    HINSTANCE h = 0;
    h=LoadLibrary("my_dll.dll");//загрузка DLL

    typedef int (*TPrototype)(int p);
    TPrototype pMyInit;
    pMyInit = (TPrototype)GetProcAddress(h, "MyInit");//получение адреса функции
    int rez = pMyInit(0);//выполнение функции и собственно создание окна
}


До этого момента всё нормально работает. Но возник
__ВОПРОС__
Необходимо создать консольное приложение откуда вызывается функция pMyInit(0), чтобы открывалось окно находящееся в DLL.
Этот код не работает:

#include <windows.h>

int main ()
{
    HINSTANCE h = 0;
    h=LoadLibrary("my_dll.dll");//загрузка DLL

    typedef int (*TPrototype)(int p);
    TPrototype pMyInit;
    pMyInit = (TPrototype)GetProcAddress(h, "MyInit");//получение адреса функции
    int rez = pMyInit(0);//выполнение функции и собственно создание окна
}


Появляется ошибка во время выполнения на строке int rez = pMyInit(0);
Подскажите что нужно делать, чтобы открыть окно в dll из консоли?

09.04.08 07:05: Перенесено модератором из 'C/C++' — Odi$$ey
Re: диалоговое окно в dll
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 09.04.08 03:13
Оценка:
Здравствуйте, ch_andr, Вы писали:

_>4. В файл добавлена следующая функция для создания и открытия окна


_>
_>extern "C" __declspec(dllexport) int MyInit(int i)
_>{
_>    CDialog_my MyDialog;//Обьект класса class CDialog_my : public CDialog
_>    MyDialog.DoModal();//Собственно создаем модальное окно
_>    return 1;
_>}
_>


MFC's common window procedure automatically switches to the correct module state, so you don't need to worry about it in any message handlers implemented in your regular DLL. But when your executable calls into the regular DLL, you do need to explicitly set the current module state to the one for the DLL. To do this, use the AFX_MANAGE_STATE macro in every function exported from the DLL. This is done by adding the following line of code to the beginning of functions exported from the DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.