![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отличия обычного проекта и Dll-проекта
Starkom © (2002-10-18 12:53:00)Была прога с кучей кода. Оформили ее, как Dll, чтобы включить в другой Билдерный проект. Перестало работать очень многое (код не менялся). Капшены у форм присваиваться неправильно стали, кейпрессы в комбобоксах перестали обрабатываться. Да вообще много что перестало или стало по-другому работать!!!
Помогите, что делать в данной ситуации?
NUU (2002-10-21 16:37:00) [1]ну у меня собственно из делфи и работает. Дык главное подход :)))
Bis (2002-10-21 16:18:00) [2]2NUU
Позвольте узнать, где это у вас работает?
Выхов из Дельфи будет работать, а вот из Буилдера сомневаюсь
Реализация объектов в Дельфи и С++ разная изначально
NUU (2002-10-21 16:05:00) [3]Попробуй так:
library ProjectDll;
uses
ShareMem,
Windows,
SysUtils,
Classes,
Forms,
MainUnit1 in "..\MainUnit1.pas" {MainForm},
Var
pApp,pScr:pointer;
// Init and Free Functions *****************************************************
procedure InitLib(App,Scr:pointer);stdCall;
begin
pApp :=Application;
pScr :=Screen;
Application :=App;
Screen :=Scr;
end;
procedure DoneLib;stdCall;// собственно необязательно, но желательно
begin
Application :=pApp;
Screen :=pScr;
end;
procedure RunGen();stdcall;
begin
MainForm:=TMainForm.Create(nil);
MainForm.Show();
end;
exports
InitLib,
DoneLib,
RunGen;
begin
end.
После окрытия бибилиотеки Dll = LoadLibrary("ProjectDLL.dll");
вызови InitLib из нее и передай Application и Screen из основной программы;
У меня так работает :)
Bis (2002-10-21 15:52:00) [4]Может это тебе поможет:
http://www.torry.net/vcl/vcltools/plugins/libmgr.zip
Менеджер библиотек DLL. Позволяет загружать и показывать формы, определенные в DLL, безмодальным (синхронным) способом. Поэтому не придется вызывать ShowModal для показа формы, если необходимо выгрузить библиотеку.
Starkom (2002-10-21 15:40:00) [5]2 Bis: пока никто :)) Планировали, что RunGen будет возвращать указатель на MainForm - а там уже все будет убиваться, очищаться.
Теперь, вообще, непонятно, как делать.
ShowModal использовать нельзя (задача такая).
Bis (2002-10-21 15:35:00) [6]Вот если б ты использовал форму в модальном режиме, все было бы нормально.
А здесь могут быть свои камни.
Где-то мелькал тут компонент, позволяющий использовать такие формы в dll, не помню только ...
А кто у тебя потом формы освобождает?
Starkom (2002-10-21 15:25:00) [7]
library ProjectDll;
uses
ShareMem,
Windows,
SysUtils,
Classes,
Forms,
MainUnit1 in "..\MainUnit1.pas" {MainForm},
{$R *.RES}
procedure RunGen();stdcall;
begin
MainForm:=TMainForm.Create(nil);
MainForm.Show();
end;
exports
RunGen;
begin
end.
и все.
вызов RunGen -
void __fastcall TFormManager::N3Click(TObject *Sender)
{
HINSTANCE Dll = GetModuleHandle("ProjectDLL.dll");
if(Dll == NULL)
{
Dll = LoadLibrary("ProjectDLL.dll");
}
void __fastcall (__import *Generator)(void);
if (Dll)
{
Generator = (void __fastcall (__import *)(void)) GetProcAddress(Dll,"RunGen");
if (Generator)
Generator();
else
ShowMessage("?????? RunGen ?? ???????");
// FreeLibrary(Dll);
}
else
ShowMessage("ProjectDLL.dll ?? ???????");
}
//---------------------------------------------------------------------------
NUU (2002-10-21 15:18:00) [8]
> А насчет простой длл - длл то у меня работает, но некоторые
> вещи почему-то работают неправильно.
дпрник длл.
Ты функции из длл статически юзаешь или динамически?
Starkom (2002-10-21 15:08:00) [9]2 NUU: какой конкретно?
Там 5 мегов в архиве одних .pas файлов
Bis (2002-10-21 15:03:00) [10]2Starkom
Да, тот самый хендл
в dll вызов функций по stdcall, почитай внимательно!
тебе трудно написать это слово? Даже если как ты считаешь в Булдере так и есть?
NUU (2002-10-21 15:01:00) [11]Это понятно код ты дашь или нет?
Starkom (2002-10-21 15:01:00) [12]то есть, по идее такой код правильнее?
Application.Initialize();
Application.CreateForm(TMainForm, MainForm);
MainForm.Show();
Starkom (2002-10-21 14:58:00) [13]register в Дельфях и __fastcall в Билдере - это же одно и то же.
NUU (2002-10-21 14:56:00) [14]Если после заголовка метода отсутствует соглашение о вызове, то по умолчанию Delphi использует соглашение register.
NUU (2002-10-21 14:53:00) [15]у длл все свое, как у отдельного приложения.
Приведи код своей простой длл и скажи чего конкретно работает неправильно?
А то непонятно.
Starkom (2002-10-21 14:39:00) [16]2 Bis:
"но советую Handle передать из буилдера и присвоить в длл."
хэндл экземпляра TApplication?
А насчет простой длл - длл то у меня работает, но некоторые вещи почему-то работают неправильно.
Насчет stdcall, конечно же, проглючил. Если в Билдере везде указывать __fastcall, то в Дельфях же можно ничего не писать. Или не так?
Bis (2002-10-21 14:31:00) [17]У длл свой TApplication,
но советую Handle передать из буилдера и присвоить в длл.
И формы надо создавать тоже самому, лучше по мере необходимости, через Application или нет, неважно.
И кто тебе сказал, что по умолчанию stdcall ?
В общем попробуй сначала написать простую dll без всяких форм и вызов хотя бы одной функции чтоб был успешным, можно показать ShowMessage в нем
Starkom (2002-10-21 14:15:00) [18]2 Севостьянов Игорь: А в Дельфях же все функции по умолчанию stdcall. Зачем его явно указывать?
2 NUU: А она и не должна быть Application.MainForm
По идее, тут вообще другой Application, основного проекта.
Или у длл должен быть свой объект класса TApplication?
Bis (2002-10-21 13:22:00) [19]а зачем вообще чего-то придумывать надо было?
Буилдер напрямую поддерживает все юниты из Дельфи!
Севостьянов Игорь (2002-10-21 13:21:00) [20]Тебя же спросили. А где объявление в Delphi варианте ?
interface
....
procedure RunGen; stdcall;
....
implementation
....
procedure RunGen; stdcall;
begin
....
end;