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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.011 c
8-12000
-= ALEX =-
2003-08-25 16:24
2004.01.05
Звук


7-12177
Woolen
2003-10-24 13:19
2004.01.05
Потоки и процессоры


1-11939
olookin
2003-12-20 10:34
2004.01.05
boolean vs bool


1-11870
Goshi
2003-12-21 22:54
2004.01.05
Загрузка TrueColor иконок в TImageList


1-11972
Andrey V.
2003-12-19 12:48
2004.01.05
Досовская задача в CreateProcess





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский