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

Вниз

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

Наверх





Память: 0.46 MB
Время: 0.01 c
14-96443
Gorlum
2003-09-09 16:57
2003.09.29
Парадокс


6-96321
Котелок
2003-07-30 05:33
2003.09.29
NMpop3 savetoeml


1-96167
fartuna
2003-09-16 11:58
2003.09.29
JEDI VCL 2.10 for D5-D7


14-96439
SiJack
2003-09-04 14:25
2003.09.29
Ура мне купят лицензионный Delphi !!!


1-96286
k_len
2003-09-17 06:39
2003.09.29
приведение типов





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