Текущий архив: 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.46 MB
Время: 0.008 c