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

Вниз

ADO и DLL   Найти похожие ветки 

 
Dima(Other)   (2003-09-09 09:40) [0]

Было у меня несколько работающих самостоятельных функций, определённых в модуле ADOEx.
Я из этого модуля сделал DLL, т.е. после каждой функции приписал STDCALL,
экспортнул и ничего в текстах не менял! Ну и в приложении прописал соответствующую строчки
в DataModule, из секции uses модулей приложения поудалял уже ненужные ссылки на ADOEx.
И тут начались глюки.
Сплошные Access Violation (и не только) в разных местах... После долгих мучений выяснил, что после включения
компа глюк происходит только в одной функции в строчке qCount.Free. Причем не сразу, сначала эта
функция нормально вызывается раз пять. После многократного запуска программы в режиме отладки
ошибки начинают сыпаться хаотически в разных местах. Приведённая ниже функция напрямую из приложения не
вызывается (хотя может), она используется внутри DLL.

В приложении в DM
function .........; StdCall; external ADOExDll;

В DLL
function ADOCount (ADS: TCustomADODataSet): integer; stdcall;
var
qCount: TADOQuery;
str: string;
Param: TParameters;
i:integer;
begin
Result := -1;

qCount := TADOQuery.Create (nil);

if {ADS is TADOQuery} ADS.ClassName = "TADOQuery" then
//^^^^^^^^^^^^^^^^^^ в DLL не работает!!! Непонятно!!!
begin
Param := TADOQuery(ADS).Parameters;
str := TADOQuery(ADS).SQL.Text;
end;
if {ADS is TADODataSet} ADS.ClassName = "TADODataSet" then
//^^^^^^^^^^^^^^^^^^ в DLL не работает!!! Непонятно!!!
begin
Param := TADODataSet(ADS).Parameters;
str := TADODataSet(ADS).CommandText;
end;
Screen.Cursor := crSQLWait;
try
qCount.Connection := ADS.Connection;
qCount.SQL.Text := string(SQLSelCount (PChar(str)));
//здесь строчка "select Field1, Field2 ..." заменяется на "select count(*)"

for i := 0 to Param.Count - 1 do
qCount.Parameters[i].Value := Param[i].Value;
try
qCount.Open;
except
ShowMessage ("Ошибка");
end;
Result := qCount.Fields[0].AsInteger;
qCount.Close;
finally
qCount.Free; //Падает здесь при первых запусках программы, но не
// при первром прогоне функции!!!
Screen.Cursor := crDefault;
end
end;


 
sniknik ©   (2003-09-09 10:32) [1]

> в DLL не работает!!! Непонятно!!!
в dll обычно нет вызова (надо самому делать) CoInitialize(nil); перед вызовом OLE (ADO из таких) и CoUnInitialize(); после всего.
попробуй поставь
перед qCount := TADOQuery.Create (nil); если еще не стоит (в другом месте)
изменится чтонибудь?


 
Polevi ©   (2003-09-09 10:40) [2]

указатель на экз. класса нельзя передавать в Dll


 
KSergey ©   (2003-09-09 10:48) [3]

Если желаете передавать указатели на объекты в dll - лучше используйте bpl. Если правильно понимаю - там эти проблемы правильнее решаются. Вернее, они вообще решаются ;), а в dll - собственная иерархия классов (в именах-то та же, но код хранится свой. (не совсем правильно выразился, но может понятно)


 
sniknik ©   (2003-09-09 11:00) [4]

Polevi © (09.09.03 10:40) [2]
почему тогда работает? (немного поправил специально)

function DllFormCreate(Handle: HWND; MainForm: TForm; DataSource: TComponent {DataSource: TDataSource}): Boolean; stdcall;
begin
if GridForm = nil then begin
Application.Handle:= Handle;
Application.CreateForm(TGridForm, GridForm);

Button:= TButton.Create(MainForm);
Button.ParentWindow:= MainForm.Handle;
Button.Caption:= "Don""t press";
Button.Left:= 60;
Button.Top:= 120;
end;
if DataSource.ClassName = "TDataSource" then
GridForm.DBGrid1.DataSource:= TDataSource(DataSource);
GridForm.ShowModal;
DllFormCreate:= true;
end;


или


 
Dima(Other)   (2003-09-09 23:09) [5]

Polevi ©
Другие же функции, где я передаю компонент работаю!!!
И ещё, это правильно:
Function Fun(Apar: PChar):Pchar;
Var
Par:string;
Begin
Par := string(APAR);
………что делаем с Par
Result := Pchar(Par);
End;


 
sniknik ©   (2003-09-10 00:10) [6]

Function Fun(Apar: PChar):Pchar;
а с Pchar значит работает, наводит на мысль о неипользуемости в модулях ShareMem-а. (+ к тому что для ADO нужны вызовы ... выше)


 
dima(Other)   (2003-09-10 07:25) [7]

sniknik © (10.09.03 00:10) [6]

А зачем он ShareMem нужен. Я так понял ,что только для передачи строк! Потому и избавился от стрингов, чтобы библиотеку ещё одну за собой не таскать


 
sniknik ©   (2003-09-10 08:23) [8]

тем не менее, DataSource без него тоже передается с ошибкой. ты попробуй, че от тебя убудет чтоли от одной проверки? не от этого, убереш.



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

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

Наверх




Память: 0.49 MB
Время: 0.024 c
3-96105
_VaaL_
2003-09-09 12:49
2003.09.29
DBExpress + MySQL


3-96056
Eagle Owl
2003-09-07 22:17
2003.09.29
Удаление с помощью SQL запроса


1-96166
Patrick
2003-09-16 11:20
2003.09.29
Чтение из регистров Windows.


3-96119
Олеся
2003-09-09 06:39
2003.09.29
Проблемы с печатью


14-96423
vidiv
2003-09-10 12:45
2003.09.29
2 Вопроса про PHP