![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача параметров в dll.
Новичек © (2004-11-05 14:41:00)Добрый день, уважаемые Мастера.
Имеется такая dll:
type
TAnyObject = class(TCustomControl)
private
protected
public
end;
var
MyObject: TAnyObject;
function AnyFunction(MyParent: TWinControl): AnsiString; stdcall;
begin
MyObject := TCustomControl.Create(Application);
MyObject.Parent := MyParent;
end;
Вот так вызываю:
procedure TForm1.Button1Click(Sender: TObject);
var
LibHandle: THandle;
begin
LibHandle := LoadLibrary('ANYDLL.DLL');
try
@AnyFunction := GetProcAddress(LibHandle, 'AnyFunction');
if not (@AnyFunction = nil) then
AnyFunction(Form1); //Передаю ссылку на Form1
finally
FreeLibrary(LibHandle);
end;
end;
Получаю сообщение:
'Control' has no paren Window.
Подскажите, пожалуйста, что неправильно?
Новичек (2004-11-05 19:17:00) [1]Заработала DLL'ка :-)
Спасибо, Мастера.
Новичек (2004-11-05 18:58:00) [2]
> PVOzerski
Спасибо, попробую...
PVOzerski (2004-11-05 16:41:00) [3]Я бы предпочел передавать в DLL только хэндл окошка, а внутри AnyFunction использовать CreateParented.
Новичек (2004-11-05 15:24:00) [4]Ваша правда, вот полный текст.
Программа:
unit Main;
interface
uses
FastShareMem, Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;
type
TAnyFunction = function(MyParent: TWinControl): AnsiString; stdcall;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
LibHandle: THandle;
AnyFunction: TAnyFunction;
begin
LibHandle := LoadLibrary('ANYDLL.DLL');
try
@AnyFunction := GetProcAddress(LibHandle, 'AnyFunction');
if not (@AnyFunction = nil) then
AnyFunction('Form1))
finally
FreeLibrary(LibHandle);
end;
end;
end.
Библиотека:
library ANYDLL;
uses
FastShareMem,
Windows,
ScktComp,
Forms,
Controls,
Messages,
Dialogs,
SysUtils,
StdCtrls,
Classes;
type
TAnyObject = class(TCustomControl)
private
protected
public
end;
var
MyObject: TAnyObject;
function AnyFunction(MyParent: TWinControl): AnsiString; stdcall;
begin
MyObject := TAnyObject.Create(Application);
MyObject.Parent := MyParent;
Result := 'Any string';
end;
exports SendCommands;
begin
end.
-=SS=- (2004-11-05 15:10:00) [5]И вообще приведи лутше полный листинг
-=SS=- (2004-11-05 15:07:00) [6]Ты так и не ответил как ты определяешь переменную AnyFunction
Новичек (2004-11-05 15:03:00) [7]
> MyObject := TAnyObject.Create(MyObject);
Это верно, в оригинале так и есть.
> Во первых какой Application
Любой проект delphi содержит эту переменную.
Можно и Create(nil), суть не изменится. (Или Self).
Тогда получается такой код:
type
TAnyFunction = function(MyParent: TWinControl): AnsiString; stdcall;
TAnyObject = class(TCustomControl)
private
protected
public
end;
var
MyObject: TAnyObject;
function AnyFunction(MyParent: TWinControl): AnsiString; stdcall;
begin
MyObject := TAnyObject.Create(Self);
MyObject.Parent := MyParent;
end;
Вот так вызываю:
procedure TForm1.Button1Click(Sender: TObject);
var
LibHandle: THandle;
begin
LibHandle := LoadLibrary('ANYDLL.DLL');
try
@AnyFunction := GetProcAddress(LibHandle, 'AnyFunction');
if not (@AnyFunction = nil) then
AnyFunction(Form1); //Передаю ссылку на Form1
finally
FreeLibrary(LibHandle);
end;
end;
Digitman (2004-11-05 15:01:00) [8]ты вообще зачем объявил класс TAnyObject ?
где ты его используешь ?
-=SS=- (2004-11-05 14:55:00) [9]Во первых какой Application ????
Во вторых что за переменная AnyFunction ????
И почему
MyObject := TCustomControl.Creat..
А не
MyObject := TAnyObject.Create(MyObject); ????????????