Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Передача объекта в DLL

11
25 декабря 2007 года
oxotnik333
2.9K / / 03.08.2007
В DLL есть некая ф-я, аргументом которой является TObject *Sender

в самой DLL хочу преобразовать TObject к тому виду, который мне нужен (в частности к TComboBox *)
если пишу так:
 
Код:
TComboBox *cmb = dynamic_cast<TComboBox*>(Sender);

cmb = NULL получается в любом случае, однако вот так:

 
Код:
TComboBox *cmb = (TComboBox*)Sender;

вроде как ловит, но во первых это ИМХО не правильно, а во вторых я не только TComboBox могу передавать.

Как правильно передать и получить объект в DLL?
19K
26 декабря 2007 года
Termi_uc
33 / / 13.02.2007
При Use Dynamic RTL == true и Build with runtime packages == true таких проблем быть не должно.

При Use Dynamic RTL == false у тебя создаются два разных класса TComboBox и приведение TComboBox *cmb = (TComboBox*)Sender будет потенциально небезопастно.
11
26 декабря 2007 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Termi_uc
При Use Dynamic RTL == true и Build with runtime packages == true таких проблем быть не должно.

При Use Dynamic RTL == false у тебя создаются два разных класса TComboBox и приведение TComboBox *cmb = (TComboBox*)Sender будет потенциально небезопастно.



как раз все в true стоит, а проблема есть

почему когда я передаю в длл, допустим int*, (void*)&map и пр. то все нормально происходит (не зависимо от Use Dynamic RTL), а когда VCL объекты, то вылязят косяки?

ЗЫ: я не создаю класс в длл, я создаю указатель определенного типа, которому затем присваиваю адрес объекта из ехе

1
26 декабря 2007 года
kot_
7.3K / / 20.01.2000
Цитата: oxotnik333
как раз все в true стоит, а проблема есть

почему когда я передаю в длл, допустим int*, (void*)&map и пр. то все нормально происходит (не зависимо от Use Dynamic RTL), а когда VCL объекты, то вылязят косяки?

ЗЫ: я не создаю класс в длл, я создаю указатель определенного типа, которому затем присваиваю адрес объекта из ехе


Сложно сказать - в чем собственно у вас проблема - этот код отрабатывает на ура - вопрос правда в том надо ли это делать - но вам с погреба виднее.
Код длл:

Код:
//.h
#ifndef loadformsH
#define loadformsH
#include <SysUtils.hpp>
//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) AnsiString ReturnProperty();
extern "C" __declspec(dllexport) HWND LoadForm(TObject *Sender);
//---------------------------------------------------------------------------
#endif

//.cpp
#pragma hdrstop

#include "loadforms.h"
#include "formdll.h"

HWND LoadForm(TObject *Sender){
 Form2 = new TForm2(NULL);
 TComboBox *cb = dynamic_cast<TComboBox*>(Sender);
 cb->Parent = Form2;
 Form2->ShowModal();
 delete Form2;
 return 0;
}

код приложения-хоста
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
typedef HWND (__import *pLoadForm)(TObject *Sender);
 pLoadForm fLoadForm;
 HINSTANCE hDll = LoadLibrary("project2.dll");
 if(!hDll)return;
 fLoadForm = (pLoadForm)GetProcAddress(hDll,"_LoadForm");
  fLoadForm(ComboBox1);
 FreeLibrary(hDll);

}

проверьте создаеться ли длл с поддержкой компонентов, возможно проблема в этом.
1
26 декабря 2007 года
kot_
7.3K / / 20.01.2000
На возвращаемое значение функции внимание не обращайте - код взят для теста из реальной функции - переделывать в облом было.
11
28 декабря 2007 года
oxotnik333
2.9K / / 03.08.2007
хедер TComboBox надо подключать?
1
29 декабря 2007 года
kot_
7.3K / / 20.01.2000
Цитата: oxotnik333
хедер TComboBox надо подключать?


Ну ты же видишь мой код? Передается указатель на базовый класс - здесь я отображаю комбобокс на форме в длл, поэтому меняю ему родителя

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог