![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при обращении к компонентам из разных Unit-ов в DLL [D6, Win2k, WinXP]
DelphiN! © (2004-12-28 06:48:00)В ДЛЛ обращаюсь к свойствам и методам компонентов из разных Юнитов, и при обращении выскакивает Access Voluition. Почему AV выскакивает при обращении к компонентам только в Длл, и как этого избежать ?
DelphiN! (2005-01-04 07:53:00) [1]
> [18] Fay © (04.01.05 07:34)
> Молча?
AV
Fay (2005-01-04 07:34:00) [2]Молча?
DelphiN! (2005-01-04 07:33:00) [3]А, не я уже глючу(вместо F7 F8 жму. :) ) . Вылетает на строчке
i := num - Main.CompList.RowCount;
DelphiN! (2005-01-04 07:28:00) [4]
> [14] Digitman © (31.12.04 08:09)
В том то и дело что в данную процедуру он даже не заходит, при вызове сразу вылетает ...
DelphiN! (2005-01-04 07:16:00) [5]Народ, ну в чем дело ? Неужели никто не знает ?
Digitman (2004-12-31 08:09:00) [6]отладчиком-то посмотреть, что при вызове DATA.GetField() не так - не судьба ?
DelphiN! (2004-12-31 06:31:00) [7]Кстати как я уже говорил ошибки возникают при обращении или передаче компонентов(в виде параметров ф-ий) из/х другие модули
DelphiN! (2004-12-31 06:29:00) [8]Application.Run;
Вообще убрал(длл у меня как плагин, а ядру это не нужно).
Однако проблемма осталась всеравно, например, если вызываю из Unit1 ф-ию, которая находится в DataModul-e, вылетает AV.
Unit1
...
procedure TMain.CompListCellClick(Sender: TObject; ACol, ARow: Integer);
begin
CurStolb := ACol;
CurStr := ARow;
if DATA.GetField(ACol,IMG,CompList) = '0' then//Вот тут вылетает AV
begin
Message.MessageDlg('Данный компьютер не отвечает на запросы от сервера, возможно он выключен или на нем не работает сеть, либо же не установлен клиент xGhost Club Admin !',mtError,[mbOk],0);
Exit;
end;
...
DATAMOD
...
function TDATA.GetField(num: Integer; Field: Integer; CompList: TGridView): String;
var
i: Integer;
begin
i := num - Main.CompList.RowCount;
Main.CompList.AddRow(i+1);
case Field of
Comp: Result := Main.CompList.Cell[Field,num].AsString;
IMG: Result := Main.CompList.Cell[Field,num].AsString;
TimeLeft: Result := Main.CompList.Cell[Field,num].AsString;
BeginTime: Result := Main.CompList.Cell[Field,num].AsString;
EndTime: Result := Main.CompList.Cell[Field,num].AsString;
end
end;
В чем теперь дело ?
Digitman (2004-12-28 10:35:00) [9]
> DelphiN! © (28.12.04 10:10) [10]
> А как оно может не передаваться ?
а это зависит от метода сборки обоих проектов .. в случае их сборки с Build With Run-Time Package объекты Application и Screen и у хост-пр-я и у ДЛЛ единые
> главная форма создается и выполнение кода вней проходит,
> вторая форма показывается тоже
оперируй названиями классов форм, а не "первая, вторая" .. иначе непонятно ..
> А я даже и не думал что после Run управление не передается
заглянем в код этого метода :
procedure TApplication.Run;
begin
FRunning := True;
try
...
if FMainForm <> nil then
begin
...
//вот он, тот самый бесконечный цикл !
//в него мы попадаем, если св-во MainForm объекта Application не пустое
//!!!!!!!!!!
repeat
try
HandleMessage;
except
HandleException(Self);
end;
until Terminated;
//!!!!!!!!!!
end;
finally
FRunning := False;
end;
end;
DelphiN! (2004-12-28 10:10:00) [10]А как оно может не передаваться ? Ведь главная форма создается и выполнение кода вней проходит, вторая форма показывается тоже, и отлично выполняется ее код, если она не обращается к первой ...
DelphiN! (2004-12-28 10:07:00) [11]
> [8] Digitman © (28.12.04 09:47)
А я даже и не думал что после Run управление не передается ...
Большое спасибо !
Digitman (2004-12-28 09:47:00) [12]вот теперь видно, что ни Main, ни frmSettings, ни frmSeanse ты не создаешь, ибо до этого даже дело не доходит - в application.Run "скрыт" бесконечный цикл ожидания/выборки/диспетчеризации win-сообщений
вызов application.Run в ходе иниц-ции ДЛЛ вообщенедопустим
library ClubAdmin;
uses
SysUtils,
Classes,
forms,
pluginloader,
Unit1 in 'Unit1.pas' {Main},
Settings in 'Settings.pas' {frmSettings},
DATAMOD in '..\..\..\..\..\xgh II\server\plugins\DATAMOD.pas' {DATA: TDataModule},
ChangeSeanse in 'ChangeSeanse.pas' {frmSeanse};
{$E plu}
{$R *.res}
procedure Init(App: TApplication; Scr: TScreen);
begin
Application := App;
Screen := Scr;
Application.CreateForm(TDATA, DATA);
Application.CreateForm(TMain, Main);
Application.CreateForm(TfrmSettings, frmSettings);
Application.CreateForm(TfrmSeanse, frmSeanse);
end;
Function xGhost_server(NewOwner:TPluginLoader):Tplugins;
begin
result:=PluginLoader.EnumPlugins(application,newowner);
result.Caption :='Управление клубом';
result.Version :='0.1';
result.Author :='Delphin / ACS inc.';
result.Key :='234pt3253df35';
end;
exports
Init,
xGhost_server;
var
Main: TMain;
procedure DllMain(dwReason: DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH:
begin
...
end;
DLL_PROCESS_DETACH:
begin
//перед выгрузкой библ-ки разрушим формы, если они еще существуют
DATA.Free;
Main.Free;
frmSettings.Free;
frmSeanse.Free;
end;
end;
end;
begin
DllProc := @DllMain;
DllMain(DLL_PROCESS_ATTACH);
end.
первым делом после загрузки хост-приложением библиотеки ты должен вызвать ее эксп.процедуру Init(Application, Screen), где Application - это объект класса TApplication, а Screen - объект класса TScreen .. оба эти объекта уже созданы в контексте хост-приложения, и вызовом этой процедуры ты устанавливаешь ссылки на эти объекты в контексте ДЛЛ .. и тут же создаешь нужные формы - теперь их владельцем становится объект Application хост-приложения
DelphiN! (2004-12-28 09:14:00) [13]
library ClubAdmin;
uses
SysUtils,
Classes,
forms,
pluginloader,
Unit1 in 'Unit1.pas' {Main},
Settings in 'Settings.pas' {frmSettings},
DATAMOD in '..\..\..\..\..\xgh II\server\plugins\DATAMOD.pas' {DATA: TDataModule},
ChangeSeanse in 'ChangeSeanse.pas' {frmSeanse};
{$E plu}
{$R *.res}
Function xGhost_server(NewOwner:TPluginLoader):Tplugins;
begin
result:=PluginLoader.EnumPlugins(application,newowner);
result.Caption :='Управление клубом';
result.Version :='0.1';
result.Author :='Delphin / ACS inc.';
result.Key :='234pt3253df35';
end;
exports
xGhost_server;
var
Main: TMain;
begin
application.Initialize;
Application.CreateForm(TDATA, DATA);
application.Run;
Application.CreateForm(TMain, Main);
Application.CreateForm(TfrmSettings, frmSettings);
Application.CreateForm(TfrmSeanse, frmSeanse);
end.
TMAIN - это Unit1
TfrmSeanse - это Unit2
Digitman (2004-12-28 09:12:00) [14]
> DelphiN! © (28.12.04 09:10) [4]
из приведенного кода это неочевидно
показывай, где и как ты ее создаешь ..
DelphiN! (2004-12-28 09:12:00) [15]Данная проблемма встречается только в Длл ...
DelphiN! (2004-12-28 09:10:00) [16]
> [3] Digitman © (28.12.04 09:09)
Конечно.
Digitman (2004-12-28 09:09:00) [17]а ты форму-то создал ? прежде чем обращаться к ней ?
DelphiN! (2004-12-28 09:06:00) [18]Да вообще любое обращение из разных модулей к компонентам в Длл. Например:
Данные Unit-ы находятся в Длл
Unit1
...
class TForm1 ...
Button1: TButton;
Unit2
...
Implimination
uses Unit1
...
begin
Form1.Button1.Caption := 'a'; //AV
end;
Digitman (2004-12-28 08:45:00) [19]
> DelphiN! © (28.12.04 06:48)
покажи код