Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.038 c
8-1093546062
Kind
2004-08-26 22:47
2004.11.21
Скорость InvalidateRect


1-1099852890
aha
2004-11-07 21:41
2004.11.21
мне нужно поставить фильтр на messagebox , то есть


14-1099640843
Суслик
2004-11-05 10:47
2004.11.21
State vs Strategy


14-1099252959
Bend
2004-10-31 23:02
2004.11.21
RichEdit & гиперссылки


1-1099939023
Alan
2004-11-08 21:37
2004.11.21
Программа для чтения!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский