создание и вызов Фрейма и modeless диалогов из DLL, плиз!!!!
От: Аноним  
Дата: 15.09.03 09:26
Оценка:
Есть не MFC-прога, которая грузит мою DLL. И вызывает из нее одну-единственную расшаренную функцию: DLLENTRY void CallMyScript(). Где DLLENTRY это extern "C" __declspec(dllexport) — ну как и должно быть. В этой функции я создаю объект Windows pFrame от СMainFrame::public CFrameWnd, ну и вызываю к жизни в этом мире.
        // Allocate a new frame window object
        CMainFrame* pFrame = new CMainFrame;
        
        // Initialize the frame window
        if (!pFrame->LoadFrame(IDR_MAINFRAME)) return;
        // Assign the frame window as the app's main frame window
        AfxGetApp()->m_pMainWnd = pFrame;

        // Show the frame window maximized
        pFrame->ShowWindow(SW_SHOWMAXIMIZED);
        pFrame->UpdateWindow();

В коде CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) я создаю свое клиентское окно=представление, тулбар, статусбар, ну и меню для кучи, что есть в виде моего ресурса и автоматом присоединяется в коде pFrame->LoadFrame(IDR_MAINFRAME)) (судя по MSDN'у).
    if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
     CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
    {
    TRACE0("Failed to create view window\n");
    return -1;
    }
    m_wndView.EnableScrollBarCtrl(SB_BOTH);
    m_wndView.SetScrollRange(SB_VERT,0,SCRLMAX);
    m_wndView.SetScrollRange(SB_HORZ,0,SCRLMAX);
    
    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
        | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
        TRACE0("Failed to create toolbar\n");
        return -1;      // fail to create
    }
    m_wndToolBar.SetWindowText("Свой тулбар");
    // TODO: Delete these three lines if you don't want the toolbar to be dockable
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBar);

    if (!m_wndStatusBar.Create(this) ||
        !m_wndStatusBar.SetIndicators(indicators,
        sizeof(indicators)/sizeof(UINT)))
    {
        TRACE0("Failed to create status bar\n");
        return -1;      // fail to create
    }

m_wndView производно от CWnd.

Так в чем же суть вопроса спросите Вы, а вот в чем. При вызове расшареной ф-ции из DLL да, мой фрейм создается и выводится на экран, да, все его дочерние элементы тоже есть на экране, да они работают, но не все: мой тулбар совсем не хочет выводить подсказки и подсвплавывать кнопку на панели при наведении на нее мышкой. И не одно сообщение не приходит в мой фрейм и в мое представление (их PreTranslateMsg при дебаге не проходят! брейкпойнты в их теле не срабатывают). Так в чем же дело. В MSDN'е вроде есть ответ : Regular DLLs must have a CWinApp-derived class and a single object of that application class, as does an MFC application. However, the CWinApp object of the DLL does not have a main message pump, as does the CWinApp object of an application ..... Note that the CWinApp::Run mechanism does not apply to a DLL, since the application owns the main message pump. If your DLL brings up modeless dialogs or has a main frame window of its own, your application's main message pump must call a DLL-exported routine that calls CWinApp::PreTranslateMessage. Но я не пойму че и где надо вызывать. Может кто нить мне поможет и прояснит ответ (только с кодом, пожалуйста!!!!). И прошу учесть, что не MFC-прога, которая грузит мою DLL, более чем одну мою функцию, что я сваял расшаренной, вызвать не может принципиально. Т.е. для правки доступен только код моей DLL. И прошуВас, умоляюю ПОБЫСТРЕЕ!!! Меня торяпят боссы.

15.09.03 18:05: Перенесено модератором из 'Проектирование' в MFC. Оффтопик. — ХД
Re: создание и вызов Фрейма и modeless диалогов из DLL, плиз
От: D_Tony  
Дата: 15.09.03 09:37
Оценка:
Сам же добавляю: забыл про modelss диалоги. Они (два) создаются по таймеру через минуту с момента открытия фрейма. И у них возникают проблемы с перерисовкой и реагированием с фреймом — они шлют сообщение ему (мною зарегистрированное WM_USER+1) и не получают ответа.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.