Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.06;
Скачать: CL | DM;

Вниз

большой вопрос про DLL   Найти похожие ветки 

 
td   (2004-05-25 21:48) [0]

Есть готовый проект, некоторые функции которого должны использоваться в др. задачах. Поэтому пишу dll, к которой подключаю модули из готового проекта и сразу же возникают вопросы.

текст процедуры в dll

procedure PlantDetails(ConfigPath, TableName: string; ID: integer; ReadOnly, TotalReadOnly: boolean); export; stdcall;

implementation

uses SU, SRZ_DM, SRZDet;

procedure PlantDetails(ConfigPath, TableName: string; ID: integer; ReadOnly, TotalReadOnly: boolean); export; stdcall;
begin

сначала Открываю файл config.ini и определяю из него пути, с этим никаких проблем не возникает

дальше мне надо создать датамодульSRZ_DM (DM)

DM:=TDM.Create(nil); //и что надо указывать в параметре?

и вот здесь начинаются проблемы, потому что на onCreate датамодуля вызывается такая процедура (которая перебирает все таблицы датамодуля - несколько десятков и присваивает им путь). В этом месте получаю ошибку Access Violation (с датамодулем все порядке - первоначальный проект работает хорошо).

  procedure AllTablesPath;
  var
   i: integer;
   TempComponent: TComponent;
  begin
   for i:=0 to DM.ComponentCount-1 do
    begin
     TempComponent:= DM.Components[I];
     if (TempComponent is TTable) and ((TempComponent.Name<>"TStruct")or(TempComponent.Name<>"TableFlot")or(TempComponent.Name<>"TableProekt"))    then
      (TempComponent as TTable).DatabaseName:=SRZPath;

    end;
  end;

Ладно, закомментировал эту процедуру в DM дальше в dll присваиваю пути таблицам вручную - все хорошо
Вызываю форму, в которой показывается масса всяких полей из этих открытых таблиц - открывается без ошибок

 FormSRZDetCrt(false);

Но на onDestroy открытой формы (FormSRZDet) все использовавшиеся таблицы закрываются (к каждой непосредственно обращаюсь по имени  DM.TableD6.Close;)- и тут тоже ошибка Access Violation;

DM.Destroy; //уничтожаю датамодуль
DM:=nil;
end;

Какое здесь может быть решение без переписывания модулей?
Спасибо!


 
Babay   (2004-05-26 05:42) [1]

Если я все верно понял, то...
По моему здесь это уже много раз обсуждалось...
Основная проблема здесь
procedure PlantDetails(ConfigPath, TableName: string;

либо используй PChar, либо модуль Sharemem.

З.Ы. когда создаешь новую Dll то в проекте черным по белому даны рекомендации от дяди Бормана по этому поводу, почитай.
Успехов :-)


 
TUser ©   (2004-05-26 07:36) [2]

[1]. И еще вот это условие зачем нужно? Скобка, которая после and, она - всегда true будет. Если ты таким образом пытался исключить обращение к таблицам TStruct, TableFlot и TablePocket, то они, конечно, все равно не исключаются. Это м.б. еще одним глюком.


> if (TempComponent is TTable) and ((TempComponent.Name<>"TStruct")or(TempComponent.Name<>"TableFlot")or(TempComponent.Name<>"TableProekt"))  



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

Текущий архив: 2004.06.06;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.061 c
6-1081586421
13-Drakosha
2004-04-10 12:40
2004.06.06
TSocketConnection


14-1084289462
Knight
2004-05-11 19:31
2004.06.06
Вокруг рутина, а душа требует экшн...


14-1084614060
Goida
2004-05-15 13:41
2004.06.06
Фильм "Убить Била" плохой...


14-1084649612
Piter
2004-05-15 23:33
2004.06.06
Вывод даты в текстовом виде


14-1084971676
AlexG
2004-05-19 17:01
2004.06.06
Как создать сервер в MSSQL?