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

Вниз

TpFibsdatabase и Dll   Найти похожие ветки 

 
yaric   (2003-12-04 18:14) [0]

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

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


 
Vlad ©   (2003-12-04 18:23) [1]

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


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

Привожу

Длл:
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.


 
Sandman25 ©   (2003-12-04 18:37) [3]

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

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


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

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

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;


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

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


 
Sandman25 ©   (2003-12-04 18:41) [6]

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


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

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

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;


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

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

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


 
Sandman25 ©   (2003-12-04 18:46) [9]

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

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


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

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


 
Sandman25 ©   (2003-12-04 18:51) [11]

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


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

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

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


 
Johnmen ©   (2003-12-04 18:57) [13]

>yaric

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


 
Vlad ©   (2003-12-04 19:13) [14]


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

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


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

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


 
yaric   (2003-12-04 19:15) [16]

yaric>>vlad

а как его создать


 
Vlad ©   (2003-12-04 19:17) [17]

Если он у тебя на форме лежит, то он сам создастся в момент создания формы. Если же ты его динамически создаешь, то так:
FibDatabase1:=TpFibDatabase.Create(nil)
Затем заполнить нужные проперти, и только после этого вызывать библиотечную процедуру.


 
yaric   (2003-12-04 19:20) [18]

Так посмотри я же это делаю
текст метода в котором происходит ошибка я привел


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

Так посмотри я же это делаю
текст метода в котором происходит ошибка я привел


 
Vlad ©   (2003-12-04 19:23) [20]

Может я чего не вижу (вечер уже и устал), но по моему ты создаешь экземпляр TpFibDataSet, а где создается TpFibDatabase - не видно. Видно лишь что она передается в процедуру в кач-ве параметра.


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

А TpFibDatabase передается через параметры в функцию которая
из длл вызывается


 
Vlad ©   (2003-12-04 19:42) [22]

Для проверки можешь вот перед этой строчкой
temp_dataset.Open
написать следующее:
if Assigned(WorkDataBase) then showmessage ("Vlad © был не прав") else showmessage ("Vlad © был прав")
О результатах увиденного сообщи


 
yaric   (2003-12-04 19:49) [23]

"Vlad © был не прав"

а ошибка все равно осталась

я тут потрейсил немного и оказалось
что ошибка возникает когда я пытаюсь начать транзакцию
в длл


 
Vlad ©   (2003-12-04 19:53) [24]


> yaric (04.12.03 19:49) [23]

Так, уже лучше.
Но что-то в коде не видно, где ты пытаешься начать транзакцию.


 
yaric   (2003-12-04 19:55) [25]

А когда я метод Open вызываю то сам temp_dataset
проверяет если транзакция к которой он привязан на
активна то стартует ее


 
Vlad ©   (2003-12-04 19:59) [26]


> yaric (04.12.03 19:55) [25]

Сие означает что у temp_dataset есть событие BeforeOpen и ты его не привел или еще что-то умалчиваешь.


 
yaric   (2003-12-04 20:02) [27]

Не ну ты же видишь(см.код) что я создаю локальный экземпляр TpFibDataSet
и ни какие BeforeOpen я для него не определяю


 
Vlad ©   (2003-12-04 20:04) [28]


> yaric (04.12.03 20:02) [27]

Тогда как вот это понимать ?

> я тут потрейсил немного и оказалось
> что ошибка возникает когда я пытаюсь начать транзакцию
> в длл

Еще раз спрашиваю - где ты пытаешься начать транзакцию ?


 
Johnmen ©   (2003-12-05 09:14) [29]

>Vlad ©

Да, похоже дело не в шаремем...
>где ты пытаешься начать транзакцию ?
Просто она стартует неявно, если указано в опциях фибдатасета poStartTransaction=True...

>yaric

Приведи (еще раз) вызов процедуры из приложения и ее реализацию в длл.


 
yaric   (2003-12-05 11:17) [30]

>>Johnmen
Да ты прав транзакция действительно стартует неявно
и как оказывается стартует нормально

Я тут еще потрейсил немного и оказывается бока наступают когда
мы залазим внутрь класса TpFibDataSet. Пока разобраться не могу
может у кого какая идея по этому поводу есть


 
Vlad ©   (2003-12-05 12:14) [31]

Возможно переменная temp_dataset объявлена еще где-то, помимо
процедуры TfrmBookOptions.GetCurrRazdStDBInfo
И еще одно маленькое предположение, попробуй вместо
temp_dataset:=TpFibDataSet.Create(self);
написать
temp_dataset:=TpFibDataSet.Create(nil);


 
yaric   (2003-12-05 15:53) [32]

Попробовал эффект тотже
то же самое когда пытаюсь передавать в библиотеку и транзакцию


 
yaric   (2003-12-05 15:54) [33]

Попробовал эффект тотже
то же самое когда пытаюсь передавать в библиотеку и транзакцию


 
Vlad ©   (2003-12-05 18:52) [34]

Тогда мыслей больше нет.
Если только в вызове процедуры что-то не так, хотя...
Ответь-ка на Johnmen © (05.12.03 09:14) [29]


 
yaric   (2003-12-08 12:28) [35]

Все народ всем спасибо
разобрался
просто надо передавать в библиотеку DBHandle: TISC_DB_HANDLE
и все нормально,
но соединение должно быть уже установленно
а в конце работы приложения вызывать еще одну функцию из библиотеки которая будет рубить коннект



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

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

Наверх




Память: 0.55 MB
Время: 0.035 c
1-11874
Berezne
2003-12-18 12:56
2004.01.05
Округление результата


1-11913
DDA
2003-12-21 16:40
2004.01.05
ShellExecute ?


1-11894
snake1977
2003-12-18 12:56
2004.01.05
MDIChild в DLL


3-11781
Manfred
2003-12-09 17:30
2004.01.05
FlushBuffers не помогает.


1-11964
Артем
2003-12-20 17:49
2004.01.05
Замена стандартной иконки папки