Главная страница
    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.46 MB
Время: 0.008 c
7-96466
Вован
2003-07-17 13:33
2003.09.29
Ограничена ли и как длина буфера COM порта???


1-96170
MakNik
2003-09-16 13:09
2003.09.29
QReport


8-96308
avk
2003-06-03 20:26
2003.09.29
все те же стрелочки... на Canvas


8-96306
TankMan
2003-05-19 19:05
2003.09.29
Никто не могбы сказать.... как это видео запихнуть в Panel ?


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