Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2012, 13:13   #1
BasVic
 
Регистрация: 12.06.2012
Сообщений: 6
По умолчанию Затруднение при загрузке дочерних форм из dll

Здравствуйте! Я пишу одну программку на C++ Builder 5 и у меня возникла одна трудность, которую не получилось красиво решить.
Описание программы: Это MDI приложение, в котором материнская форма - это приложение, а каждая дочерняя форма отдельная DLL - драйвер устройства, которая загружается динамически. Каждая dll имеет свой клиентский сокет для доступа к серверному сокету своего управляемого устройства. Сколько штук, какие дочерние формы должны загружаться и откуда - записано в БД. Есть некоторые действия, которые инициирует материнское приложение и передаёт их в нужную DLL через специально написанную функцию. Одним из входных параметров функции - является указатель на конкретную дочернюю форму. Поэтому команды отправляются туда, куда задумано. Всё нормально работает, пока каждый драйвер присутствует в одном экземпляре.
Описание проблемы:
Для подключения нескольких одинаковых устройств необходимо несколько раз загрузить один и тот же драйвер. Команда из материнской формы отправляется в нужный драйвер, из нужного драйвера она ретранслируется через свой сокет в своё управляемое устройство, оттуда ответ возвращается по тому же сокету, но попадает в то окно драйвера из, нескольких одинаковых, которое было загружено первым. В остальные окна ответы просто не попадают. Если сделать несколько копий одного и того же файла драйвера и загружать их из разных файлов, то проблема уходит, но это не красивое решение.
Народ, кто сталкивался с такой проблемой и как её удалось решить?

Фрагмент кода:
Код:
      
      //---------------------------------------------------
      // Подключение
      //---------------------------------------------------
      if (as.AnsiCompare("dsp") == 0)
        {
          Type = 2;
          msg.Delete(1,as.Length()+1);
          ADOConnMain->Connected = true;
          ADOQueryMain->Active = true;
          TabCtrl->Visible = true;
          try
            {
              int v_i = 0;
              int idx = 0;

              ADOQueryMain->First();
              while (!ADOQueryMain->Eof)
                {
                  param->Add(msg + "," + ClientSocket->Host + "," + IntToStr(ClientSocket->Port+1+v_i));
                  if (ADOQueryMain->FieldByName("Ena")->AsInteger > 0)
                    {
                      TabCtrl->Tabs->Append(ADOQueryMain->FieldByName("Name")->AsString);
                      arr_Form[v_i].Form = NULL;
                      if (arr_Form[v_i].Lib = LoadLibrary(ADOQueryMain->FieldByName("File")->AsString.c_str()))
                        {
                          TLoadForm* LoadForm = (TLoadForm* )GetProcAddress(arr_Form[v_i].Lib, "_LoadForm");
                          if (LoadForm)
                            {
                              arr_Form[v_i].Form = LoadForm(Application, Type, param->Strings[v_i] );    // Создать форму
                              FormIndex[idx++] = v_i;  //связать индекс указателя на форму с индексом в TabCtrl
                              arr_Form[v_i].GetState = (int(__stdcall*)(void* Form))GetProcAddress(arr_Form[v_i].Lib,"_GetState");
                              arr_Form[v_i].QuitForm = (void(__stdcall*)(void* Form))GetProcAddress(arr_Form[v_i].Lib,"_QuitForm");
                            }
                          else
                            {
                              arr_Form[v_i].Form = NULL;
                              arr_Form[v_i].GetState = NULL;
                              arr_Form[v_i].QuitForm = NULL;
                            }
                        }
                    }
                  v_i++;
                  ADOQueryMain->Next();
                }
              TabCtrlChange(Sender);
              msg.Delete(1,msg.Pos(','));
            }
          __finally
            {
              TimerScan->Enabled = true;
              TabCtrl->Height = 49;
            }
          return;
        };

Последний раз редактировалось BasVic; 12.06.2012 в 16:51.
BasVic вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание вкладок дочерних форм arthur1 C# (си шарп) 1 28.04.2012 08:53
Утечка памяти при загрузке ресурсов из dll t2skler Общие вопросы Delphi 4 18.05.2011 17:15
Много дочерних форм... L.A.M.E.R. Общие вопросы Delphi 4 03.08.2010 08:13
Ошибка при загрузке dll nikmay Общие вопросы Delphi 10 25.06.2009 15:42
Ошибка при загрузке DLL dani92 Общие вопросы Delphi 12 24.04.2009 14:54