Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
ВнизПередача параметров в dll. Найти похожие ветки
← →
Новичек (2004-11-05 14:41) [0]Добрый день, уважаемые Мастера.
Имеется такая 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.
Подскажите, пожалуйста, что неправильно?
← →
-=SS=- © (2004-11-05 14:55) [1]Во первых какой Application ????
Во вторых что за переменная AnyFunction ????
И почему
MyObject := TCustomControl.Creat..
А не
MyObject := TAnyObject.Create(MyObject); ????????????
← →
Digitman © (2004-11-05 15:01) [2]ты вообще зачем объявил класс TAnyObject ?
где ты его используешь ?
← →
Новичек (2004-11-05 15:03) [3]
> 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;
← →
-=SS=- © (2004-11-05 15:07) [4]Ты так и не ответил как ты определяешь переменную AnyFunction
← →
-=SS=- © (2004-11-05 15:10) [5]И вообще приведи лутше полный листинг
← →
Новичек (2004-11-05 15:24) [6]Ваша правда, вот полный текст.
Программа:
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.
← →
PVOzerski © (2004-11-05 16:41) [7]Я бы предпочел передавать в DLL только хэндл окошка, а внутри AnyFunction использовать CreateParented.
← →
Новичек (2004-11-05 18:58) [8]
> PVOzerski
Спасибо, попробую...
← →
Новичек (2004-11-05 19:17) [9]Заработала DLL"ка :-)
Спасибо, Мастера.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c