Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Вниз

Ошибка при обращении к компонентам из разных Unit-ов в DLL   Найти похожие ветки 

 
DelphiN! ©   (2004-12-28 06:48) [0]

В ДЛЛ обращаюсь к свойствам и методам компонентов из разных Юнитов, и при обращении выскакивает Access Voluition. Почему AV выскакивает при обращении к компонентам только в Длл, и как этого избежать ?


 
Digitman ©   (2004-12-28 08:45) [1]


> DelphiN! ©   (28.12.04 06:48)  


покажи код


 
DelphiN! ©   (2004-12-28 09:06) [2]

Да вообще любое обращение из разных модулей к компонентам в Длл. Например:
Данные Unit-ы находятся в Длл
Unit1
...
class TForm1 ...
Button1: TButton;

Unit2
...
Implimination
uses Unit1
...
begin
 Form1.Button1.Caption := "a"; //AV
end;


 
Digitman ©   (2004-12-28 09:09) [3]

а ты форму-то создал ? прежде чем обращаться к ней ?


 
DelphiN! ©   (2004-12-28 09:10) [4]


>  [3] Digitman ©   (28.12.04 09:09)


Конечно.


 
DelphiN! ©   (2004-12-28 09:12) [5]

Данная проблемма встречается только в Длл ...


 
Digitman ©   (2004-12-28 09:12) [6]


> DelphiN! ©   (28.12.04 09:10) [4]


из приведенного кода это неочевидно
показывай, где и как ты ее создаешь ..


 
DelphiN! ©   (2004-12-28 09:14) [7]


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:47) [8]

вот теперь видно, что ни 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 10:07) [9]


>  [8] Digitman ©   (28.12.04 09:47)


А я даже и не думал что после Run управление не передается ...

Большое спасибо !


 
DelphiN! ©   (2004-12-28 10:10) [10]

А как оно может не передаваться ? Ведь главная форма создается и выполнение кода вней проходит, вторая форма показывается тоже, и отлично выполняется ее код, если она не обращается к первой ...


 
Digitman ©   (2004-12-28 10:35) [11]


> 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-31 06:29) [12]

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;

В чем теперь дело ?


 
DelphiN! ©   (2004-12-31 06:31) [13]

Кстати как я уже говорил ошибки возникают при обращении или передаче компонентов(в виде параметров ф-ий) из/х другие модули


 
Digitman ©   (2004-12-31 08:09) [14]

отладчиком-то посмотреть, что при вызове DATA.GetField() не так - не судьба ?


 
DelphiN! ©   (2005-01-04 07:16) [15]

Народ, ну в чем дело ? Неужели никто не знает ?


 
DelphiN! ©   (2005-01-04 07:28) [16]


>  [14] Digitman ©   (31.12.04 08:09)


В том то и дело что в данную процедуру он даже не заходит, при вызове сразу вылетает ...


 
DelphiN! ©   (2005-01-04 07:33) [17]

А, не я уже глючу(вместо F7 F8 жму. :) ) . Вылетает на строчке  
i := num - Main.CompList.RowCount;


 
Fay ©   (2005-01-04 07:34) [18]

Молча?


 
DelphiN! ©   (2005-01-04 07:53) [19]


>  [18] Fay ©   (04.01.05 07:34)
> Молча?


AV



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.037 c
14-1104043729
SergP
2004-12-26 09:48
2005.01.16
Я фигею с эры


6-1098683509
OlegM
2004-10-25 09:51
2005.01.16
Как узнать с какого компа в сети подключаются к ресурсу на машине


1-1104275154
KriNeedHelp
2004-12-29 02:05
2005.01.16
kak dobavit animaciju gif formata v programku??


14-1104374973
Думкин
2004-12-30 05:49
2005.01.16
С днем рождения! 30 декабря


3-1102603978
Rule
2004-12-09 17:52
2005.01.16
Как добраться до TDataLink





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский