Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создание в DLL динамических компонентов 
:(
    Опции темы
mrKoddy
Дата 8.6.2005, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
Хотя доступ к указателю объекта позволяет в принципе подменить ее обрабочики на другие, если в этом есть необходимость.

А можно поподробнее, как это сделать?
Допустим про
Код

Компонент->Обработчик = Функция;

я имею понятие.
Цитата
Как Вы определили, что указатель на форму не передается?

Я не говорил, что определил.Просто прога вываливается и все.
Цитата
Ну и ради бога. Создавайте и назначайте. Здесь то какие проблемы?

Смотрите самое начало моего поста.

Это сообщение отредактировал(а) mrKoddy - 8.6.2005, 19:52
PM MAIL   Вверх
Vyacheslav
Дата 9.6.2005, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(mrKoddy @ 8.6.2005, 19:43)
Смотрите самое начало моего поста.


Извините, но я прочитав Ваше пост так и не нашел проблемы, которая возникает при создании обработчиков. Нельзя поподробнее для тупых smile (т.е меня) типа : "Я не могу в dll создать обработчик потому что ..." Для формы в exe Вы можете создавать обработчики? Думаю, да. Что же мешает ту же самую операцию проделать в dll?

Цитата(mrKoddy @ 8.6.2005, 19:43)

Я не говорил, что определил.Просто прога вываливается и все.

А кто мешает воспользоваться дебагером для выявления причин?



Цитата(mrKoddy @ 8.6.2005, 19:43)
А можно поподробнее, как это сделать?
Допустим про
код C++
1:

Компонент->Обработчик = Функция;


Ну как я понимаю на интересует вариант, когда мы не имеем хидера в exe? Ну например так. Мы знаем, что у формы из dll (formdll) есть кнопка с именем Button1. Находим эту кнопку
Код


//.. 
TForm* form = CreateMyForm(this);
 if (TButton* btn = dynamic_cast<TButton*>(form->FindComponent("Button1")))
 {
      btn->OnClick = MyNewClick;
 } 
//.. 
void __fastcall TForm1::MyNewClick(TObject *Sender)
{
     ShowMessage("Replaced button handler");
}
    





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
mrKoddy
Дата 9.6.2005, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
Извините, но я прочитав Ваше пост так и не нашел проблемы

Ну вообще-то я имел ввиду сообщение от 8.6.2005, 19:43 smile Ну да ладно.
Цитата
А кто мешает воспользоваться дебагером для выявления причин?

При вызове функции CreateMyForm(NULL) появляется:
Цитата

Project Project1.exe raised exception class EResNotFound with message 'Resource TForm2 not found'. Process stopped. Use Step or Run to continue.

В принципе логично, т.к. объявление TForm2 (TForm2 *Form2) у меня есть только в DLL. Т.е. все сделано по аналогии как в и в ехе.
Цитата

Код

//.. 
TForm* form = CreateMyForm(this);
 if (TButton* btn = dynamic_cast<TButton*>(form->FindComponent("Button1")))
 {
      btn->OnClick = MyNewClick;
 } 
//.. 
void __fastcall TForm1::MyNewClick(TObject *Sender)
{
     ShowMessage("Replaced button handler");
}


Опять 25.Ну не хочу я обработчик MyNewClick в ехе-модуле. smile
PM MAIL   Вверх
Vyacheslav
Дата 10.6.2005, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Ну до чего уж Вы упрямый
Цитата(mrKoddy @ 9.6.2005, 19:49)
Опять 25.Ну не хочу я обработчик MyNewClick в ехе-модуле. 

Я Вам показал в качестве примера на Ваше

Цитата(mrKoddy @ 8.6.2005, 19:43)
А можно поподробнее, как это сделать?
Допустим про

Да если не хотите, не делайте. Мы тут развели целую дискуссию вокруг проблемы, которой нет.

Цитата(mrKoddy @ 9.6.2005, 19:49)
При вызове функции CreateMyForm(NULL) появляется:

Цитата

Project Project1.exe raised exception class EResNotFound with message 'Resource TForm2 not found'. Process stopped. Use Step or Run to continue.


В принципе логично, т.к. объявление TForm2 (TForm2 *Form2) у меня есть только в DLL. Т.е.
все сделано по аналогии как в и в ехе.

Да не логично это. Иначе у меня да и у всех ни одна программа не работала. Сама то форма в dll c помощью дизайнера создана или Вы просто ручками интерфейс набили? Я еще раз говорю - код в студию.
Можете вот это в качестве примера хотя бы посмотреть. Там MDI окно главное и MDI-child окно и модальное в dll. Статья в принципе об использовании template, но пример к ней посмотреть можно
http://bcdev.narod.ru/Articles/dll_template.htm




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
mrKoddy
Дата 10.6.2005, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
Сама то форма в dll c помощью дизайнера создана или Вы просто ручками интерфейс набили?

Ручками.
Цитата
Там MDI окно главное и MDI-child окно и модальное в dll.

Нет.
Цитата
Я еще раз говорю - код в студию.

Ни вопрос. smile
Код DLL (unit1.cpp)
Код

#include <vcl.h>
#include <windows.h>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "RXCtrls.hpp"
#include "Unit1.h"
#pragma hdrstop
#pragma argsused
TForm2 *Form2;
__fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
{
}
void __fastcall TForm2::Button1Click(TObject *Sender)
{
MessageBox(NULL,"Test","Test",MB_OK);
}
void __fastcall initApp( HWND mainAppWnd )
{
 Application->Handle  = mainAppWnd ;
}
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
extern "C" void __export CreateMyForm(TForm* Owner)
{
(new TForm2(Owner))->Show();
}

Код DLL(unit1h)
Код

//--Unit1.h-------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "RXCtrls.hpp"
//---------------------------------------------------------------------------
class TForm2 : public TForm
{
typedef TForm inherited;
__published:    // IDE-managed Components
        TButton *Button1;
        void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:        // User declarations
        __fastcall TForm2(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern TForm2 *Form2;
//---------------------------------------------------------------------------
#endif 

Код в ехе (unit1.h)
Код

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//#include "sButton.hpp"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button3;
        void __fastcall Button3Click(TObject *Sender);
private:    // User declarations
public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Код в ехе (unit1.cpp)
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
void (__stdcall *New_Page)(int FieldVal, TForm* MainForm);
vid (__stdcall *initApp)(HWND mainAppWnd);
void  (__stdcall* CreateMyForm)(TForm* Owner);
HINSTANCE dllp = LoadLibrary("Project1.dll");
    if (dllp) {
                CreateMyForm = (void  (__stdcall*) (TForm* Owner))
               GetProcAddress(dllp, "_CreateMyForm");
               CreateMyForm(NULL);
               }
}

Правда он не совсем рабочий.
PM MAIL   Вверх
Vyacheslav
Дата 14.6.2005, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(mrKoddy @ 10.6.2005, 19:42)
Ручками.

То есть в dll у Вас dfm-файла для формы нет?
Тогда все то же самое, только предварительно добавьте форму в dll через меню File->New->Form . Надеюсь и вопрос как обработчики в dll создавать отпадет сам собой smile




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
mrKoddy
Дата 14.6.2005, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
То есть в dll у Вас dfm-файла для формы нет?

Нет.
Цитата
Тогда все то же самое, только предварительно добавьте форму в dll через меню File->New->Form .

эээ..а зачем? Ее "просто так" так создать нельзя?
Цитата
Надеюсь и вопрос как обработчики в dll создавать отпадет сам собой

Я тоже надеюсь. smile Один у меня там в принципе создан.
PM MAIL   Вверх
Любитель
Дата 14.6.2005, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата
эээ..а зачем? Ее "просто так" так создать нельзя?

Ну так dfm тебе все равно нужен, если в dll у тебя будет форма.


--------------------
PM MAIL ICQ Skype   Вверх
mrKoddy
Дата 15.6.2005, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
Ну так dfm тебе все равно нужен, если в dll у тебя будет форма.

Ну если я таким же образом создаю форму в ехе-шнике, то я без dfm обхожусь спокойно.К тому же сколько будет у меня форм, мне вообще-то не известно. Поэтому вариант с dfm отпадает.
PM MAIL   Вверх
Любитель
Дата 15.6.2005, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Ну так тогда, насколько я знаю, ты не сможешь из dll экспортировать именно форму. Или я не прав?


--------------------
PM MAIL ICQ Skype   Вверх
Vyacheslav
Дата 16.6.2005, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(mrKoddy @ 15.6.2005, 19:38)
Ну если я таким же образом создаю форму в ехе-шнике, то я без dfm обхожусь спокойно.К тому же сколько будет у меня форм, мне вообще-то не известно. Поэтому вариант с dfm отпадает

СЧАС ВЗОРВУСЬ.
Во-первых, есть класс формы + dfm - это не есть объект(сама форма). Сколько экземляров этих форм будет - это зависит от программиста. Как количество форм(объектов) завит от dfm? Я уже давал код при котором, создастся столько форм, сколько раз будет вызвано это. И когда это давал, то предполагал, что TForm2 имеет dfm
Код

 extern "C" void  __declspec(dllexport) CreateMyForm(TForm* Owner)
{
      (new TForm2(Owner))->Show();
}

А вот этот код будет всегда изпользовать только однажы созданную форму
Код

extern "C" void  __declspec(dllexport) CreateMyForm(TForm* Owner)
{
      static TForm2* form = new TForm2(Owner);
      form->Show();
}

Каким образом dfm здесь может регламентировать количество создаваемых форм?

Во-вторых, Вы делая некоторые утверждения, упускаете совсем для Вас "малозначительные" факты, и тем самым вводите людей в заблужение
Я уверен, что Вы не " таким же образом" создаете форму в ехе-шнике. Если у Вас она без dfm, то Вы скорее всего используете непосредственно класс TForm или используете конструктор типа TForm1(TComponent*, int). В dll же Вы пытаетесь использовать класс, производный от TForm. Разницу чувствуете? К тому же это Ваш код или не Ваш ?
Код

#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}

В-третьих. Вам удалось сделать наконец такую простейшую вещь как экспорт формы из dll?Думаю, что нет. И это несмотря на вполне профессиональные советы двух форумов, которые Вам дают уже на протяжении полумесяца. Я еще раз повторюсь, что Вы для себя сложили какую-то несоответствующую реалиям картину "мира" и в этих рамках пытаетесь что то сделать. То , что не укладывается в вашу картинку, просто отбрасываете. Выглядит со стороны это так
Вы: Как сделать это?
Вам: Так-то и так-то
Вы: Я так делать не буду, потому что ( далее следуют абсолютно бесмысленные доводы)

И опять в по кругу

И если мы не выйдем их этого круга, плодотворная работа у нас с Вами врядли получится.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
mrKoddy
Дата 17.6.2005, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
И когда это давал, то предполагал, что TForm2 имеет dfm

Цитата

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

Значит я не правильно выразился вначале.
Цитата
Я уверен, что Вы не " таким же образом" создаете форму в ехе-шнике.

Да, извеняюсь, поторопился.
Цитата
К тому же это Ваш код или не Ваш ?

Мой.
Цитата
Разницу чувствуете?

Да.
Цитата
Вам удалось сделать наконец такую простейшую вещь как экспорт формы из dll?Думаю, что нет

Первым способом удалось, вторым нет. Причина - отсутствие ресурса TForm2.
Цитата

И это несмотря на вполне профессиональные советы двух форумов, которые Вам дают уже на протяжении полумесяца. Я еще раз повторюсь, что Вы для себя сложили какую-то несоответствующую реалиям картину "мира" и в этих рамках пытаетесь что то сделать. То , что не укладывается в вашу картинку, просто отбрасываете. Выглядит со стороны это так
Вы: Как сделать это?
Вам: Так-то и так-то
Вы: Я так делать не буду, потому что ( далее следуют абсолютно бесмысленные доводы)
И опять в по кругу
И если мы не выйдем их этого круга, плодотворная работа у нас с Вами врядли получится.

Да, есть у меня такое. smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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