Форум: "Основная";
Текущий архив: 2004.03.09;
Скачать: [xml.tar.bz2];
ВнизПомогите разобраться в DLL Найти похожие ветки
← →
iluxa (2004-02-25 13:53) [0]Мастера помогите разобраться в DLL
делаю так:
library com_dll;
uses
ShareMem,
SysUtils,
Classes,
Forms,
Unit1 in "Unit1.pas" {Form1};
{$R *.RES}
exports
connect;
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OoMisc, AdPort;
type
TForm1 = class(TForm)
ApdComPort1: TApdComPort;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
public
end;
function connect(var nomer:byte):integer; export;
var
Form1: TForm1;
implementation
{$R *.DFM}
function connect(var nomer:byte):integer;
begin
try
Form1.ApdComPort1.ComNumber:=nomer;
Form1.ApdComPort1.Open:=true;
except
else
ShowMessage("Возникло исключение "+Exception(ExceptObject).message);
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ApdComPort1.Open:=false;
end;
end.
и вызываю ее так
unit test;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function connect(var nomer:byte):integer; external "com_dll";
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
i:byte;
begin
i:=0;
connect(i);
end;
end.
при этом происходит ошибка
project ** raised exeption class Ewin32Error with message "A Win32 API function failed"
Что происходит? Подскажите пожалуйста.
← →
iluxa (2004-02-25 14:28) [1]а при закрытии вообще вешает всю систему :(
← →
KSergey (2004-02-25 14:39) [2]В модуле DLL:
> Application.Initialize; - не надо!
> Application.CreateForm(TForm1, Form1); (2)
(2)
Вообще-то создавать форму при первой загрузке DLL - не правильно, получается, что для всех запущеных экземпляров программ, данную DLL использующих, используется один и тот же экземпляр Form1, что не верно.
Форму необходимо создавать в экспортируемой ф-ции.
← →
iluxa (2004-02-25 14:43) [3]т.е.
function connect(var nomer:byte):integer;
begin
try
Form1.create;// вот-так ??
Form1.ApdComPort1.ComNumber:=nomer;
Form1.ApdComPort1.Open:=true;
except
else
ShowMessage("Возникло исключение "+Exception(ExceptObject).message);
end;
end;
← →
Mystic (2004-02-25 14:45) [4]Используй пакеты
← →
KSergey (2004-02-25 14:46) [5]> Form1.create;// вот-так ??
Нет, вот так не получится ;) - конструктор формы имеет параметры
И еще
> function connect(var nomer:byte):integer; external "com_dll";
Может дописать расширение "com_dll .dll"
← →
iluxa (2004-02-25 14:48) [6]нужна DLL. чтобы ее и из СИ могли пользовать
← →
iluxa (2004-02-25 14:52) [7]function connect(var nomer:byte):integer;
begin
try
Application.CreateForm(TForm1, Form1);// сделал так
Form1.ApdComPort1.ComNumber:=nomer;
Form1.ApdComPort1.Open:=true;
except
else
ShowMessage("Возникло исключение "+Exception(ExceptObject).message);
end;
end;
а все равно при запуске DDL с параметрами запуска вылетает ошибка
, а при запуске из самой програмки использующей DLL вешается вся система, (это все при закрытии)
← →
iluxa (2004-02-25 14:59) [8]а может я вообще все неправильно делаю :(
нужно DLL которая работает с компонентом для порта
и реализует несколько функций,
как это можно правильно решить, подкиньте скелетик, пожалуйста
← →
KSergey (2004-02-25 15:38) [9]Чтобы и из Си можно было вызывать необходимо объявлять
> function connect(var nomer:byte):integer; stdcall;
> а может я вообще все неправильно делаю :(
> подкиньте скелетик, пожалуйста
А почитать статьи прямо на этом сайте - это не наш метод? Обязательно кто-то найти должен?
http://www.delphimaster.ru/articles/usedll/index.html
http://www.delphimaster.ru/articles/dll_use/index.html
← →
iluxa (2004-02-25 15:53) [10]прочитал все, и эти статьи и другие, а все равно :(
← →
Digitman (2004-02-25 16:35) [11]
> iluxa (25.02.04 15:53) [10]
на кой ляд тебе вообще форма нужна в ДЛЛ ?
← →
Erik (2004-02-25 16:56) [12]ShareMem нельзя использовать если вызывать из других языков будеш. А формы в Dll это для професионалов.
← →
KSergey (2004-02-25 17:09) [13]> [11] Digitman © (25.02.04 16:35)
Хороший вопрос ;) Я не риснул, думаю - может хитрость какая военная ;)
> [12] Erik © (25.02.04 16:56)
> А формы в Dll это для професионалов.
Не, это не правда, т.к. у меня получается ;)
К стати, про ShareMem я не заметил
А может в этом все и дело? Ведь, судя по тексту, в основной программе у него ShareMem не вызывается... Хотя, возможно, и не в этом - ведь пока без String - ну разные менеджеры памяти, не все ли равно: из Sharemem они или из самого кода...
← →
iluxa (2004-02-25 17:52) [14]хорошо , форма мне и не нужна, мне нужен компонент невизуальный, как мне это сделать, подскажите пожалуйста, а то я уже запутался
← →
Digitman (2004-02-25 18:03) [15]
> мне нужен компонент невизуальный
НевизуальныйКомпонент := КлассНевизуальногоКомпонента.Create(Владелец);
← →
panov (2004-02-25 20:25) [16]>KSergey © (25.02.04 17:09) [13]
Хотя, возможно, и не в этом - ведь пока без String - ну разные менеджеры памяти, не все ли равно: из Sharemem они или из самого кода...
Нет, не все равно. Должен использоваться один и тот же менеджер памяти.
← →
KSergey (2004-02-26 05:27) [17]> panov © (25.02.04 20:25) [16]
В случае передачи String, массивов и т.д. - разумеется. Но если это не использовать - не все ли равно? Если не используем ShareMem - у каждого свой менеджер (вшитый в код), если используем где-то - будет использоватся менеджер из ShareMem. Но не все ли равно какой менеджер используется, если не испльзовать передачу String и т.п.?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.03.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c