Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание нескольких окон одной функцией из DLL 
V
    Опции темы
MANAB
Дата 19.7.2010, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 17.5.2009
Где: Беларусь, Минск

Репутация: нет
Всего: нет



Здраствуйте.
У меня стоит задача написать dll-ку, котрая будет показывать график. В Dll-ке 2 функции - ShowChart( double* data, int n ) и CloseWindow().
У меня есть класс в dll-ке, который создает окно и рисует график. Выглядит это примерно так:
Код

class CMyApp
{
...
};


extern "C" 
{
    __declspec( dllexport ) void Close(); //закрыть окно и освободить ресурсы
    __declspec( dllexport ) void ShowChart( double* DataVector, int n ); //показать график
}

HANDLE g_hMod;
HWND g_hWnd;
vector<double> g_Data;

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
    g_hMod = hModule;
    return TRUE;
}

void ShowChart( double* DataVector, int n )
{
    g_Data1.clear();
    if ( n > 0 )
    {
        for ( int i = 0; i < n; i++ )
        {
            g_Data1.push_back( DataVector[i] ); //копируем данные
        }

        InitCommonControls();

        CMyApp* d3dApp;
        d3dApp = new CMyApp();
        d3dApp->Create( HMODULE( g_hMod ) );
        d3dApp->Run();
        g_hWnd = d3dApp->GetWindow();
    }

    return;
}



Проблема заключается в следующем:
Я вызываю функцию ShowChart несколько раз, чтобы построить несколько графиков. Эти несколько окон открываются и успешно все показывают. НО! При закрытии любого из окон остальные на закрытие уже не реагируют. ЧТо я не правильно делаю? Просветите нуба smile 


Это сообщение отредактировал(а) MANAB - 19.7.2010, 17:26
PM MAIL ICQ   Вверх
Dem_max
Дата 19.7.2010, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Код

d3dApp = new CMyApp();

это есть а delete d3dApp нету


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
MANAB
Дата 19.7.2010, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 17.5.2009
Где: Беларусь, Минск

Репутация: нет
Всего: нет



Код

void Close()
{
    SendMessage( g_hWnd, WM_CLOSE, 0 , 0 );
    delete d3dApp;
    return;
}

Просто не указывал и так явную функцию. Тем более проблема не в этом. Да и d3dApp можно статическим делать.
Дело не в этом. Дело в том, что обработка сообщение происходит только для последнего открытого окна.
Окно как бы теряется что ли...

Это сообщение отредактировал(а) MANAB - 19.7.2010, 18:09
PM MAIL ICQ   Вверх
borisbn
Дата 19.7.2010, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 6
Всего: 135



ты даже префикс дал соответствующий g_hWnd
у тебя этот g_hWnd переписывается вызовом 
Цитата(MANAB @  19.7.2010,  17:25 Найти цитируемый пост)
g_hWnd = d3dApp->GetWindow();

при каждом вызове ShowChart
лучше всего не хранить ничего статически ( глобально ) в библиотеке, а отдавать этот HWND "наверх", а функция Close должна получать то, что ей нужно закрыть/освободить
Код

void Close( HWND hWnd, CMyApp * d3dApp )
{
    SendMessage( hWnd, WM_CLOSE, 0 , 0 );
    delete d3dApp;
    return; // <-- а это - прикольно
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Abyx
Дата 20.7.2010, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 2
Всего: 10



глобальные переменные - зло.

HANDLE g_hMod;  - вот это вообще не надо, к тому же это HMODULE а не HANDLE
надо юзать 
Код

extern "C" IMAGE_DOS_HEADER __ImageBase;
.......
(HMODULE)__ImageBase

PM MAIL   Вверх
MANAB
Дата 20.7.2010, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 17.5.2009
Где: Беларусь, Минск

Репутация: нет
Всего: нет



Попробую зайти немного с другого боку.
Функция Close вызываться будет только потом, чтобы очистить память, или, если ну очень понадобиться, программно закрыть окно. А вообще окно закрывается пользователем, "щелчком по крестику". Вообще правильно будет вот так:
Код

vector<CMyApp*> d3dApps;

...//подобавляли указатели классов в список


void Close()
{
    for ( int i = 0; i < d3dApps.size(); i++ )
    {
        SendMessage( d3dApps[i]->GetWindow(), WM_CLOSE, 0 , 0 );
        delete d3dApps[i];
    }
    
    d3dApps.clear();
}


Суть вообще не в этом.
Суть в том, что когда вызывается функция ShowChart, которая показывает новое окно с графиком (опять таки не придирайтесь к тому, что там данные старого графика теряются, это для упрощения написано), то старое окно перестает реагировать на сообщения. Любое из окон можно закрыть ("щелчком по крестику"), но остальные уже на закрытие не реагируют и продолжают висеть. На обращения к ним, типа по нажатию F1 вывести некоторую информацию, реагирует только последнее открытое окно, т.е. словно сообщения теряются. И я не понимаю, почему так происходит.

Добавлено через 11 минут и 49 секунд
Ой, ребят, кажется нашел.
В общем намудрил немного с реализацией класса (как обычно), так что извиняйте.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.