Как сохранить значение глобальной переменной без изменений в проекте ATL? - PullRequest
0 голосов
/ 11 апреля 2009

Мне нужна помощь по использованию глобальной переменной в проекте ActiveX (ATL). По сути, функция компонента ActiveX заключается в переходе к указанному URL в составном элементе управления (встроенный браузер). Строка URL инициализируется в начале и сохраняется в глобальной переменной. Вот мой файл исходного кода проекта ActiveX.

(Не беспокойтесь о грамматике, я просто хочу показать поток кода).

    MyComponentInit.cpp


    // MyComponentInit.cpp : Implementation of MyComponentInit.cpp

    #include "stdafx.h"
    #include <ios> 

    char szURL[1024] = "\0";   // global variable holding URL string

    STDMETHODIMP CMyComponentInit::InitPlugin(BSTR url)
    {
       // convert BSTR to string
         ...... 

           memcpy(szURL, szUrl, len);
    }




    MyComponentCtrl.cpp 

    // MyComponentCtrl.cpp : Implementation of  MyComponentCtrl.cpp

    #include "stdafx.h"

    extern char  szURL[1024]

    LRESULT CMyComponentCtrl::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
       ......

        m_spWebbrowser->Navigate(szURL, &v, &v, &v, &v);
     }

mycomponent ActiveX используется в тестовом приложении MFC SDI (Single Doc / View). Поток как:

  1. В приложении Initinstance я вызвал activeX InitPlugin для инициализации строки URL.
  2. В диалоговом окне «Информация» вставьте MyComponentCtrl ActiveX, чтобы открыть диалоговое окно «Информация», щелкните пункт меню «Информация о мэйнфрейме». Цель состоит в том, чтобы при появлении диалогового окна «Информация» оно всегда могло перейти по указанному URL-адресу.

После запуска моего тестового приложения MFC я нажимаю диалоговое меню «Информация», можно открыть диалоговое окно «Информация» и правильно перейти к URL-адресу.

Но проблема в том, что если я закрою диалоговое окно «Информация», подождите некоторое время (около 2–3 минут), я попытаюсь снова вызвать диалоговое окно «Информация», оно не может перейти к URL. Я отладил его и обнаружил, что глобальная переменная szURL в проекте MyComponenet потеряла свое значение.

Подскажите, пожалуйста, что мне делать, чтобы решить эту проблему?

Заранее большое спасибо!

Bionicoder

1 Ответ

1 голос
/ 11 апреля 2009

Похоже, что приложение и COM могут выпускать и перезагружать вашу DLL между вызовом инициализации и отображаемым элементом управления. Это может произойти, если основное приложение не имеет активных экземпляров какого-либо из COM-компонентов DLL и впоследствии вызывает CoFreeUnusedLibraries ().

Вы можете проверить это, поставив точку останова или трассировку из DllMain для fdwReason == DLL_PROCESS_DETACH. Если это проблема, точка останова сработает после вызова инициализации, но до OnInitDialog ().

Если это проблема, вы можете решить ее, инициализируя экземпляр элемента управления с помощью URL-адреса напрямую, используя состояние экземпляра вместо глобальной переменной.

Вы можете поочередно хранить ссылку на интерфейс инициализации на время жизни приложения.

...