Передача объекта в DLL
в самой DLL хочу преобразовать TObject к тому виду, который мне нужен (в частности к TComboBox *)
если пишу так:
Код:
TComboBox *cmb = dynamic_cast<TComboBox*>(Sender);
cmb = NULL получается в любом случае, однако вот так:
Код:
TComboBox *cmb = (TComboBox*)Sender;
вроде как ловит, но во первых это ИМХО не правильно, а во вторых я не только TComboBox могу передавать.
Как правильно передать и получить объект в DLL?
При Use Dynamic RTL == false у тебя создаются два разных класса TComboBox и приведение TComboBox *cmb = (TComboBox*)Sender будет потенциально небезопастно.
Цитата: Termi_uc
При Use Dynamic RTL == true и Build with runtime packages == true таких проблем быть не должно.
При Use Dynamic RTL == false у тебя создаются два разных класса TComboBox и приведение TComboBox *cmb = (TComboBox*)Sender будет потенциально небезопастно.
При Use Dynamic RTL == false у тебя создаются два разных класса TComboBox и приведение TComboBox *cmb = (TComboBox*)Sender будет потенциально небезопастно.
как раз все в true стоит, а проблема есть
почему когда я передаю в длл, допустим int*, (void*)&map и пр. то все нормально происходит (не зависимо от Use Dynamic RTL), а когда VCL объекты, то вылязят косяки?
ЗЫ: я не создаю класс в длл, я создаю указатель определенного типа, которому затем присваиваю адрес объекта из ехе
Цитата: oxotnik333
как раз все в true стоит, а проблема есть
почему когда я передаю в длл, допустим int*, (void*)&map и пр. то все нормально происходит (не зависимо от Use Dynamic RTL), а когда VCL объекты, то вылязят косяки?
ЗЫ: я не создаю класс в длл, я создаю указатель определенного типа, которому затем присваиваю адрес объекта из ехе
почему когда я передаю в длл, допустим 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;
}
#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);
}
{
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);
}
проверьте создаеться ли длл с поддержкой компонентов, возможно проблема в этом.
На возвращаемое значение функции внимание не обращайте - код взят для теста из реальной функции - переделывать в облом было.
хедер TComboBox надо подключать?
Цитата: oxotnik333
хедер TComboBox надо подключать?
Ну ты же видишь мой код? Передается указатель на базовый класс - здесь я отображаю комбобокс на форме в длл, поэтому меняю ему родителя