powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ADO и DLL
5 сообщений из 5, страница 1 из 1
ADO и DLL
    #32259373
minva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Было у меня несколько работающих самостоятельных функций, определённых в модуле ADOEx.
Я из этого модуля сделал DLL, т.е. после каждой функции приписал STDCALL,
экспортнул и ничего в текстах не менял! Ну и в приложении прописал соответствующую строчки
в DataModule, из секции uses модулей приложения поудалял уже ненужные ссылки на ADOEx.
И тут начались глюки.
Сплошные Access Violation (и не только) в разных местах... После долгих мучений выяснил, что после включения
компа глюк происходит только в одной функции в строчке qCount.Free. Причем не сразу, сначала эта
функция нормально вызывается раз пять. После многократного запуска программы в режиме отладки
ошибки начинают сыпаться хаотически в разных местах. Приведённая ниже функция напрямую из приложения не
вызывается (хотя может), она используется внутри DLL.

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

В DLL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
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;
...
Рейтинг: 0 / 0
ADO и DLL
    #32259596
Александр Спелицин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
function ADOCount (ADS: TCustomADODataSet): integer; stdcall;
begin
if ADS is TADOQuery then ...

Все верно. И никогда не будет работать! В Длл и в Ехе разные RTTI.
Работа с DLL в Delphi ничего кроме проблем не приносит. Проблемы можно разрешить только кардинальным способом - не использовать Dll, т.е. устранив их причину. Сам одно время экспериментировал с Dll, и очень рад, что от них и использую сейчас пакеты (то что имеет расширение *.bpl). Так что настоятельный Вам совет - последуйте моему примеру.
...
Рейтинг: 0 / 0
ADO и DLL
    #32259730
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DLL использовать можно, только не надо передавать туда объекты через параметры.
...
Рейтинг: 0 / 0
ADO и DLL
    #32260579
minva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Другие же функции, где я передаю компонент работают!!!
И ещё, это правильно?:
Function Fun(Apar: PChar):Pchar;
Var
Par:string;
Begin
Par := string(APAR);
………что делаем с Par
Result := Pchar(Par);
End;
...
Рейтинг: 0 / 0
ADO и DLL
    #32260609
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minva
не совсем правильно, по крайней мере вывод данных
стоит использовать функцию StrPCopy... а предварительно выделить память под указатель, причем чтоб выделило приложение ее, дабы потом смогло уничтожить. в качестве примера как это сделать, посмотри API функцию GetUserName.

Александр Спелицин
Если вы не умеете работать с dll, то это и будет головная боль. Нужно просто грамотно работать и в итоге можно получить прекрасный механизм. А bpl... меня в них как минимум не устраивает то что невозможно их загружать динамически, что в случае с библиотеками я более чем часто использую (LoadLibrary)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ADO и DLL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]