powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / коннект из Dll к бд...
25 сообщений из 25, страница 1 из 1
коннект из Dll к бд...
    #32152243
Фотография ScableR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, тут такой вопрос возник (скока бьюсь, ну ни как :()...
В общем надо в dll-ке хранить функции для коннекта к БД (в моем случае используется Access). Потом эту функцию вызывать из программы и получать на экран данные запроса. Вот заготовка, которая не пашет :(. Еррорку выдает. Привожу практически полные тексты.

------- access.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.
LIBRARY access;

USES
  SysUtils,
  ADODB, DB,
  Classes;

{$R *.res}

   FUNCTION Search(Temp: TComponent): TDataSourcet;
   VAR
      ADOQ_SQL: TADOQuery;
      DS_SQL  : TDataSource;
      Path : String;
   BEGIN
      GetDir( 0 , Path);

      ADOQ_SQL := TADOQuery.Create(Temp);
      DS_SQL   := TDataSource.Create(Temp);

      WITH ADOQ_SQL DO
      BEGIN
         ConnectionString := 'Provider=MSDASQL.1;Persist Security Info=False;User ID=admin;Data Source=MS Access Database;Mode=ReadWrite;Initial Catalog=' + Path + '\DB\access.mdb';
      END;

      WITH ADOQ_SQL.SQL DO
      BEGIN
         Clear;
         Add('SELECT * FROM Privilege');
      END;
      ADOQ_SQL.Open;
      DS_SQL.DataSet := ADOQ_SQL;

      result := DS_SQL;
   END;

EXPORTS Search;
BEGIN

END.

------- prog.exe ---------------
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
   PROCEDURE TForm1.Button1Click(Sender: TObject);
   VAR
      Handle : integer;
      Search :  function (Temp: TComponent) : TDataSource;
   BEGIN

     Handle := LoadLibrary(PChar('access.dll'));
     IF Handle <>  0  THEN
     BEGIN
        @Search := GetProcAddress(PlgHandle, 'Search');
        IF @Search <> nil then
        BEGIN
           DBLookupComboBox1.ListSource := search(self);
           DBLookupComboBox1.ListField := 'name';
           DBLookupComboBox1.KeyField := 'id';
        END ELSE
           ShowMessage('Внимание! Ошибка! Данная библиотека (dll) ''Битая''!');
        FreeLibrary(PlgHandle);
      END ELSE
         ShowMessage('Внимание! Ошибка! Dll не найдена!');
   END;
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32152256
olga1999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где конкретно выдает ошибку в Dll ?
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32152301
Фотография ScableR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот здеся:

DBLookupComboBox1.ListSource := search(self);

Что-то непонятное просто :(. Скока пытался, ну никак. А если ф-ю создать в самой программе, то все работает ок.
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32152309
Фотография ScableR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если быть точнее, то по ходу из длл-ки нифига не приходит (еррор выдается на программу), а вот как заставить все это заработать ???? Требуется пока не позарез, но скоро придеться резаться :(..... Боюсь.... Если не смогу решить :(.
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32152315
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32152316
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел в виду другое :-)
>Handle := LoadLibrary(PChar('access.dll'));
>@Search := GetProcAddress(PlgHandle, 'Search');

ПОчему хандл идет в handle а работаеш ты с plgHandle?
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32152329
SiDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно Вам поможет
OleInitialize(nil);
OleUnInitialize;
вставить нужно в начале функции в длл-е и в конце соотв-но.

FUNCTION Search(Temp: TComponent): TDataSourcet;
неполохо бы сделать
FUNCTION Search(Temp: TComponent): TDataSourcet; far;

И неплохо бы было привести ошибку к-ую выдает :)
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32152480
Фотография ScableR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2alex_k:
>> Handle := LoadLibrary(PChar('access.dll'));
>> @Search := GetProcAddress(PlgHandle, 'Search');
> ПОчему хандл идет в handle а работаеш ты с plgHandle?
Все дело в том, что текст перед вставкой сюды я немного отредактировал (вытер лишнее & ets), поэтому тут и закралась ошибка :(. На самом деле используется Handle.

2SiDen:
> Возможно Вам поможет
> OleInitialize(nil);
> OleUnInitialize;
> вставить нужно в начале функции в длл-е и в конце соотв-но.

Можешь привести пример? Просто я честно говоря не пол :(.

> И неплохо бы было привести ошибку к-ую выдает :) При запуске из Delphi:
Код: plaintext
Project Project.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'. Process stopped....
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32152533
SiDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного почесав репу, я понял, что это тоже не поможет.
Неверно передаются пар-ры из процедуры.
1. У Вас не закрывается и не дестроятся компоненты.
2. После выгрузки либы непонятно куда ссылается TDataSource

Если подойдет, то так:

Код: 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.
44.
45.
46.
47.
48.
49.
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DBCtrls, StdCtrls, ADODB, DB;
type
  TForm1 = class(TForm)
    Button1: TButton;
    DBLookupComboBox1: TDBLookupComboBox;
    a: TDataSource;
    b: TADOQuery;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
VAR
      Handle : integer;
      Search :  procedure (Temp: TComponent; var mytds: TDataSource; var myqs: TADOQuery);
begin
     Handle := LoadLibrary(PChar('..\dll\aaa.dll'));
     IF Handle <>  0  THEN
     BEGIN
        @Search := GetProcAddress(Handle, 'Search');
        IF @Search <> nil then
        BEGIN
           search(self,a,b);
           DBLookupComboBox1.ListSource := a;
           DBLookupComboBox1.ListField := 'FirstName';
           DBLookupComboBox1.KeyField := 'clientid';
        END ELSE
           ShowMessage('Âíèìàíèå! Îøèáêà! Äàííàÿ áèáëèîòåêà (dll) ''Áèòàÿ''!');
        FreeLibrary(Handle);
      END ELSE
         ShowMessage('Âíèìàíèå! Îøèáêà! Dll íå íàéäåíà!');
// Где-то еще должны закрыть открытый adoquery b
end;

end.


И тогда сама длля
Код: 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.
library aaa;
uses
  SysUtils,
  ADODB,
  DB,
  Dialogs,
  Classes;
{$R *.res}
   procedure Search(Temp: TComponent; var a: TDataSource; var b: TADOQuery); far;
   VAR
      Path : String;
   BEGIN
      GetDir( 0 , Path);
      WITH b DO
      BEGIN
         ConnectionString := 'SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=BILLING;Data Source=EPSILON';
      END;

      WITH b.SQL DO
      BEGIN
         Clear;
         Add('SELECT top 1 * FROM clients with (nolock)');
      END;
      b.Open;
      a.DataSet := b;
   END;

EXPORTS Search;

begin
end.
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32152648
Фотография ScableR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2SiDen:
В принципе идея не плохая, но вся заморочка состоит как раз в том, что длл-ка должна содержать в себе способы коннекта к БД. То есть в ней по замыслу.. Стоп, стоп, стоп. А с помощью ADO сейчас можно ко всем (или практически ко всем) БД подключиться? Подскажите, кто знает.
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32152675
Фотография ScableR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А тем более как быть с тем, что определенные длл-ки будут писаться на Сях?
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32152985
SiDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коннект и происходит в длл-е. В зависимости от бд меняется конекшнстринг.
Либо Вам надо передавать в длл-ю некий указатель с некоторой структурой, в длл-е ее забивать и возвращать этот указатель.
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32153234
Фотография ScableR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может кто подскажет, как все это реализовать? Просто надо еще и искать с помощью этой длл-ки, а возвращать значения в DBGrid. Как реализовать тока???
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32153259
SiDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаете все в длл-е.
Создание объектов.
Коннект к базе.
Выполнение запроса.
!! Переливаете данные в Вашу структуру (хоть PChar)
Закрываете запрос.
Делаете дисконнект.

В самой проге. Дергаете функцию из длл-и, которая возвращает данные в Вашей структуре.
Переливаете данные из структуры туда, куда нужно.

По поводу коннекта к разным БД: т.к. в длл-и делаете коннект, то и конекшн стринг будет задаваться там. В зависимости от того какой он будет туда и будет коннект.
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32153306
Фотография ScableR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты наверное что-то типа этого имеешь в виду??? Так вот, это ни фига не пашет :(. Пример можешь привести. Если времени не жалко. Теорию-то я и сам знаю, а вот на практике это е**** тварь меня посылает! В общем вот последний листинг:
---------------- DLL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
   FUNCTION SH(Temp: TComponent; var Auto: TDataSource): Integer; far;
   VAR
   ...

   ...
      ADOQ_SQL.Open;
      DS_SQL.DataSet := ADOQ_SQL;
      Auto := DS_SQL;

      Result :=  0 ;
   END;


В программе практически ни каких изменений
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
   PROCEDURE TForm1.Button1Click(Sender: TObject);
   VAR
      Handle : integer;
      Sh :  FUNCTION (Temp: TComponent; VAR Auto:TDataSource) : Integer;
      Auto:TDataSource;
   BEGIN
     Handle := LoadLibrary(PChar('access.dll'));
     IF Handle <>  0  THEN
     BEGIN
        @Sh := GetProcAddress(Handle, 'SH');
        IF @SH <> nil THEN
        BEGIN
           IF sh(self, Autott) =  0  THEN BEGIN
              DBLookupComboBox1.ListSource := Autott;
              DBLookupComboBox1.ListField := 'name';
              DBLookupComboBox1.KeyField := 'id';
              DBGrid1.DataSource := Autott;
           END;
        END ELSE
           ShowMessage('Внимание! Ошибка! Данная библиотека (dll) ''Битая''!');
        FreeLibrary(Handle);
     END ELSE
        ShowMessage('Внимание! Ошибка! Dll не найдена!');
   END;

И на линии
Код: plaintext
              DBGrid1.DataSource := Autott;

Выдается ошибка 'Invalid pointed operation'. И усе. Кто знает КАК ЭТО НОРМАЛЬНО ЗАПУСТИТЬ???
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32153399
SiDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, не это. Это вообще неверный подход имхо.
Под Вашей структурой я имел в виду например динамический список.
Тем паче, что после получения данных из длл-и. Вам не удастся их так просто втолкнуть в комбо-бокс (почему не просто комбо бокс неясно).
Более того, Вы не закрываете ни коннект, ни запрос. И не дестройете объекты.
Переменная Auto у Вас действительна в рамках одной функции, что должен показывать комбобокс, когда: 1. Переменная с данными на которую указывает ListSource не действительна.
2. Даже если она глобальная, то она является указателем на данные, которые получены в длл-е, которая выгружена.
3. Даже если длл-я не выгружена, то все равно переменные, которые там объявляются (конекшн и куери) дестройены (при чем некорректно).

Вообщем, я не знаю для чего Вам так мучаться, но Ваш подход вкорне неверен.
Либо попробуйте посмотреть на Вашу проблему под другим углом и сделать по-другому, либо если подходит, то используйте тот вариант, который я Вам уже написал, либо использовать просто комбобокс+например динамичесикий список. Если обрисуете саму проблему, то может ALL еще чего-нить подскажет.
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32153754
Фотография ScableR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Если обрисуете саму проблему, то может ALL еще чего-нить подскажет.
Надо надеяться.
Сама проблема уже немного изменилась. Надо всего-навсего с помощью длл-ки искать данные в БД и отображать их на экране в DBGrid'е. Желательно не использовать компоненты ADO, расположенные на форме (как в примере SiDen. Хотя пример интерестный). Вот такая вот галиматья.
SiDen спасибо за критику :) постараюсь исправиться.
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32153759
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы, господа, вобще читаете, что мастер создания проектов пишет?

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes
. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

У меня было когда-то подобное и дело как раз было в ShareMem. Если функция работает в программе, а в библиотеке нет, то я процентов на 90 уверен, что это оно самое и есть.
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32153785
Фотография ScableR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Вы, господа, вобще читаете, что мастер создания проектов пишет?
Когда-то читал.

> У меня было когда-то подобное и дело как раз было в ShareMem.
> Если функция работает в программе, а в библиотеке нет, то
> я процентов на 90 уверен, что это оно самое и есть.

Не, ну я ее подрубил и ни фига :(. Такое разочарование. Или я опять что-то не то делаю.
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32153835
SiDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Gold: Я наверное к сожалению не пользуюсь мастерами %)))
Но зато отчетливо себе представляю, что ничего хорошего не выйдет, если загрузить длл-ю, там что-то сделать, в проге ссылаться на объект созданный в длл-е и выгружать ее. А тот пример что я привел реально работает. Хотя идея хорошая попытаться втолкать все память. Проблема в том, что у меня не получилось получить реальный размер датасета и соответственно с ним поработать как с куском памяти.
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32153837
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А у меня были подобные глюки именно из-за этого.
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32153934
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
2 Gold: передавать можно все что угодно безо всяких там ШареМемов.
Только передавать надо как const.
Глюки возникают, если объект типа String (а это есть объект!), созданный в host-программе, попытаться редактировать в dll (или наоборот).
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32154703
Фотография ScableR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Gold & eNose & ALL:
Господа, может кто поможет, а то эти пространственные размышления в слух ни фига не помогли :( (практически). Может у кого-то есть готовое решение (исходник), поделитесь плз.......
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32154806
Фотография ScableR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лана, всем, кто тут участвовал сенкс, вроде наметилась у меня тут тропка :)...
...
Рейтинг: 0 / 0
коннект из Dll к бд...
    #32154810
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Готового решения нет :-(

В-общем, делай так:
1) объяви в проге переменную типа TDataSource и сделай ей create;
2) передавай в dll свой DataSource;
3) в dll делай коннект, используя полученный DataSource.
Код: plaintext
1.
2.
3.
4.
5.
6.
FUNCTION Search(DS: TDataSource): Boolean;
VAR
    {...}
BEGIN
    {...}
  DS.DataSet := ADOQ_SQL;
    {...}

Должно сработать.
Только не создавай в dll ADOQ_SQL - при выходе он уничтожится и будет Access Violation.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / коннект из Dll к бд...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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