Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TpFibsdatabase и Dll [D7, IB6.x]


Страницы:   1 2

yaric ©   (2003-12-04 18:14:00) 

Привет всем у меня возникла следующая проблема кто знает
помогите:

открываю из длл библиотеки форму на котрой лежит
TpFibTransaction, Database передается как параметр из основного приложения. Передача параметров проходит нормально, однако когда
я пытаюсь как то работать через эту БД возникают ошибки при вызове метода TpFibDataset.Open


yaric   (2003-12-04 19:13:00) [21]

Я прочитал
та мнаписано что проблемы могут возникнуть с передачей
параметров типа string но я же с параметрами таких типов не работаю. Так в чем тогда дело


Vlad   (2003-12-04 19:13:00) [22]


> Johnmen © (04.12.03 18:57) [13]

Думаешь из-за ShareMem? Она ведь вроде при работе со стрингами нужна ?
Мне кажется что в момент вызова библиотечной процедуры экземпляр TpFibDatabase не создан.


Johnmen   (2003-12-04 18:57:00) [23]

>yaric

Нажимай последовательно:
File-New-Other-DLL Wisard получишь болванку для библиотеки.
Внимательнейшим образом прочти закомментаренный текст !
:)))


yaric   (2003-12-04 18:57:00) [24]

Спасибо >>Sandman25 разъяснил

Ну кто нибуть теперь подскажите что делать с коннектом к БД??


Sandman25   (2003-12-04 18:51:00) [25]

Это же Application не DLL, а хоста (вызывающего приложения).
При таком создании в Application хоста добавляется ссылка на эту форму DLL, и при выходе из программы Application попытается ее очистить, вызывая тем самым access violation.


yaric   (2003-12-04 18:49:00) [26]

А почему не рекомендуется создавать формы с владельцем Application?


Sandman25   (2003-12-04 18:46:00) [27]

>А может какие идеи есть насчет ошибки связанной с Open?

Почти никаких, кроме того, что, возможно, не стоит создавать формы с владельцем Application.
FIBDataset я никогда не использовал и даже не видел, помочь ничем не могу.


yaric   (2003-12-04 18:44:00) [28]

Да согласен сглупил

А может какие идеи есть насчет ошибки связанной с Open?


yaric   (2003-12-04 18:42:00) [29]

Место в методе формы где происходит ошибка

procedure TfrmBookOptions.GetCurrRazdStDBInfo;
var date_str:string;
temp_dataset:TpFibDataSet;
begin
dateTimetostring(date_str,"dd.mm.yyyy", Curr_data);
temp_dataset:=TpFibDataSet.Create(self);
temp_dataset.Database:=WorkDatabase;
temp_dataset.Transaction:=ReadTransaction;
try
temp_dataset.SQLs.SelectSQL.Text:=" SELECT * FROM BU_SPR_RAZD_ST_SELECT("+""""+date_str+""""+","+IntToStr(DEFAULT_ROOT_ID)+") WHERE ID_RAZD_ST="+IntToStr(Curr_Id_RzdSt);

temp_dataset.Open--!!Вот здесь происходит Access Violation;


Sandman25   (2003-12-04 18:41:00) [30]

Потому что тем самым
DS := Screen
присваивает значение локальной переменной (которая дальше даже не используется), а не модульной, как планировалось.


yaric   (2003-12-04 18:40:00) [31]

А почему выделенную строку нужно убрать?


yaric   (2003-12-04 18:39:00) [32]

Коструктор формы которая вызывается из библиотеки

constructor TfrmBookOptions.Create(AOwner: TComponent;
Database: TpFibDatabase;FS:TFormStyle; Curr_Date:TdateTime;);
begin
inherited Create(AOwner);
self.formstyle:=FS;
WorkDatabase:=Database;
ReadTransaction.DefaultDatabase:=Database;
WriteTransaction.DefaultDatabase:=Database;
Curr_data:=Curr_Date;
end;


Sandman25   (2003-12-04 18:37:00) [33]

procedure InitPlugin(App, Scr: integer); StdCall;
var DA: TApplication; DS: TScreen;
begin

Выделенную строку лучше убрать.


yaric   (2003-12-04 18:35:00) [34]

Привожу

Длл:
library mdidll;

uses
SysUtils,
Classes,
Forms,
pFibDatabase,
uBookOptions in "uBookOptions.pas" {frmBookOptions},
uMain_Book_Ini in "uMain_Book_Ini.pas";

var
DA : TApplication;
DS : TScreen;

procedure InitPlugin(App, Scr: integer); StdCall;
var DA: TApplication; DS: TScreen;
begin
DS := Screen;
Screen := TScreen(Scr);
DA := Application;
Application := TApplication(App);
end;

procedure DonePlugin; StdCall;
begin
Screen := DS;
Application := DA;
end;

function CreateMDI(AOwner:TComponent; Database:TpFibDatabase; FS:TFormStyle; Book_Date:TDateTime): integer; StdCall;
begin
Result :=integer(TfrmBookOptions.Create(AOwner,Database,FS,Book_Date));
end;

exports
InitPlugin,
DonePlugin,
CreateMDI;

begin
end.


Vlad   (2003-12-04 18:23:00) [35]

Ты не привел ни сообщения об ошибке ни пример кода своей программы. Телепаты в отпуске.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо