Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.21;
Скачать: CL | DM;

Вниз

Передача параметров в 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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.04 c
14-1098987894
Piter
2004-10-28 22:24
2004.11.21
Авторизация на прокси сервере


1-1099484746
dolphin
2004-11-03 15:25
2004.11.21
Создание курсора


3-1098527932
Black
2004-10-23 14:38
2004.11.21
Как отобразить значение n ой записи m ого столбца?


6-1094778737
массив
2004-09-10 05:12
2004.11.21
Как в TWebBrowser переключать кодировку на Кириллица Windows


3-1098418036
Denis_Ac
2004-10-22 08:07
2004.11.21
Заполнение DBCombobox/ DBListBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский