powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / обращение к DataSet через dll
12 сообщений из 37, страница 2 из 2
обращение к DataSet через dll
    #39752536
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фэйтл ЭраПетр надо чтобы из другой программы (язык MQL4) получить последовательность записей запроса Query (select * from table)
Что ж ты сразу не сказал про мкл4.

Фиг тебе, а не интерфейсы.
И, естественно, никаких тебе объектов из dll.
Используй какую-нибудь json или xml или csv для возврата структур. Проще всего возвращать все записи сразу. Ибо иначе тебе придется в длл готовить и хранить контекст запроса. Ничего сложного, просто кодить больше.

На самом деле все работает. Осталась одна проблема: глобальное объявление ADOQuery к которому идет обращение несколько раз пока до дойдем по последней записи.

Так вот вопрос если все методы описанные выше сделать в виде интерфейса или класса - будет создаваться свой экземпляр этого объекта в своем разделе памяти?
...
Рейтинг: 0 / 0
обращение к DataSet через dll
    #39752545
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петрбудет создаваться свой экземпляр этого объекта в своем разделе памяти?В каком своем?
Не надо его нигде объявлять. Его надо создавать и возвращать функцией создания в основную программу. Как хэндл.
...
Рейтинг: 0 / 0
обращение к DataSet через dll
    #39752551
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПетрТак вот вопрос если все методы описанные выше сделать в виде интерфейса или класса - будет создаваться свой экземпляр этого объекта в своем разделе памяти?
В "своем". :)
Например, такая схема: вызываешь dll метод GetQuery('select ... from ...'), в котором создается TADOQuery и возвращается указатель на него. Далее, для перебора записи используешь, например, метод FetchNext(указатель_на_запрос TADOQuery), который возвращает структуру (xml,json), содержащую текущую запись. Или возвращающую признак EOF, а текущую запись вытягиваешь по отдельному полю, GetField(имя_поля).
Не забыть придумать стратегию обработки ошибок: например, когда коннект обломился или поля такого нет.

И в конце не забыть вызвать метод разрушения объекта. Ручками, до выгрузки dll.
...
Рейтинг: 0 / 0
обращение к DataSet через dll
    #39752566
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да вы правы, создавать надо из основной программы.

Ну какбы вроде все встало на свои места.

Обработка исключений - это конечно самое тонкое место. Главная проблема обрыв коннекта. Буду думать

Всем спасибо за помощь.
...
Рейтинг: 0 / 0
обращение к DataSet через dll
    #39755835
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
решил все таки сделать доступ к компонентам ADO через интерфейс и что-то заблудился в двух соснах, при присвоении интерфейсной переменной получаю runtime error.
для примера набросал проект.
Код: pascal
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.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
unit prj_test;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   ADODB, StdCtrls;

type
  // Определение интерфейса
  IMQLADO = Interface(IInterface)
  ['{A821E663-27E2-462F-AD1C-96AA200117CE}']
  function OpenConnect(ServerName, DatabaseName:PWideChar):Pointer stdcall;
end;

type
  TMQLADO = Class(TInterfacedObject, IMQLADO)
  private
  public
    function OpenConnect(ServerName, DatabaseName:PWideChar):Pointer stdcall;
end;


type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
{
constructor TMQLADO.Create();
begin
 inherited;
end;
}

function TMQLADO.OpenConnect(ServerName, DatabaseName:PWideChar):Pointer stdcall;
var
 ADOConnection: TADOConnection;
var
  strerr: widestring;
begin
  try
    ADOConnection := TADOConnection.Create(nil);
    ADOConnection.LoginPrompt := false;
    ADOConnection.KeepConnection := false;
    if not ADOConnection.Connected then
     begin
      ADOConnection.Close;
      ADOConnection.ConnectionString := 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=' + DatabaseName + ';Data Source=' + ServerName + ';Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False';
      ADOConnection.ConnectionTimeout := 30;
      ADOConnection.Connected := true;
      result := Pointer(ADOConnection);
     end;
  except
    on e: Exception do
    begin
      strerr := 'ERROR: ' + E.Message;
      result := NIL;
    end;

  end;
 end;
procedure TForm1.Button1Click(Sender: TObject);
var
  IMQL: IMQLADO;
  TMQL: TMQLADO;
begin
  TMQL.Create;
  IMQL := TMQL; // <- RUNTIME ERROR 
end;

end.



Что не так делаю?
...
Рейтинг: 0 / 0
обращение к DataSet через dll
    #39755838
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр,

Результат выполнения Create чему то присваиваешь?))
...
Рейтинг: 0 / 0
обращение к DataSet через dll
    #39755841
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да затупил
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TForm1.Button1Click(Sender: TObject);
var
  IMQL: IMQLADO;
  TMQL: TMQLADO;
begin
  TMQL := TMQLADO.Create;
  IMQL := TMQL;
  IMQL.OpenConnect('(local)', 'MT4');
end;
...
Рейтинг: 0 / 0
обращение к DataSet через dll
    #39755844
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр,

Ты не лез бы пока в интерфейсы, мил человек, с таким то уровнем базовых навыков (прошу без обид), думаешь они тебе чем то помогут?
...
Рейтинг: 0 / 0
обращение к DataSet через dll
    #39755856
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для вызова переменной интерфейса через DLL, делаю функцию ее создания в DLL
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
library ptr_mssql;
***
function GetMQLADO(): IMQLADO;
begin
  Result := TMQLADO.Create;
end;

exports

GetMQLADO;

begin

end.



но вызов GetMQLADO из основной программы - опять выдает runtime error

Код: pascal
1.
2.
3.
4.
5.
6.
procedure TForm1.Button3Click(Sender: TObject);
var
  IMQL: IMQLADO;
begin
 IMQL := GetMQLADO();
end;


что не так делаю?
...
Рейтинг: 0 / 0
обращение к DataSet через dll
    #39755869
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проблема была в неверном объявлении импортируемой функции
правильный вызов:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
***
function GetMQLADO(): IMQLADO; external 'ptr_mssql';
***
procedure TForm1.Button3Click(Sender: TObject);
var
  IMQL: IMQLADO;
begin
 IMQL := GetMQLADO();
end;
...
Рейтинг: 0 / 0
обращение к DataSet через dll
    #39755873
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тестовый пример работает, коннект устанавливается и разрывается:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
unit prj_test;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   ADODB, StdCtrls, MQLADO, InterfaceMSSQL, ShareMem;
***
var
  Form1: TForm1;
  HandleConnect: Pointer;
  HandleQuery: Pointer;
  IMQL: IMQLADO;

function GetMQLADO(): IMQLADO; external 'ptr_mssql';

procedure TForm1.Button3Click(Sender: TObject);
begin
 IMQL := GetMQLADO();
 HandleConnect := IMQL.OpenConnect('(local)', 'MT4');
 IMQL.CloseConnect(HandleConnect);
end;


но после закрытия формы основной программы получаю ошибку 'Invalid pointer operation'.
Хотя я так понимаю память интерфейсной переменной сама должна была освободиться. Както дополнительно надо ее освобождать?
...
Рейтинг: 0 / 0
обращение к DataSet через dll
    #39755941
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петрсам а должна былапри выходе из зоны видимости переменной. Глобальную переменную - ручками, раньше выгрузки dll
...
Рейтинг: 0 / 0
12 сообщений из 37, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / обращение к DataSet через dll
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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