Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.01.2011, 17:37
Abracadabra Abracadabra вне форума
Прохожий
 
Регистрация: 11.01.2011
Сообщения: 6
Репутация: 10
По умолчанию Проблема с DLL

Помогите пожалуйста разобраться )
Я подключаю Dll динамически..загружается нормально, но функцию описаную в Dll не находит

Функция описанная в Dll:
Код:
function CreateFilter:MYAPI2;stdcall; 
 begin
  Result:= PictureFilter.Create;
 end;

exports
  CreateFilter;


Та часть кода где вызываю dll, и пытаюсь функцию вызвать:
Код:
Type
 TCreateFilter = function: MYAPI2;

procedure TForm1.LoadData;
var
  p:Tbitmap;
  hPlugIn: THandle;
  CreateFilter: TCreateFilter;
  Filter: MYAPI2;
begin
 hPlugIn := LoadLibrary('plugin.dll');
 CreateFilter := GetProcAddress(hPlugIn,'CreateFilter');
 if Assigned(CreateFilter) then// не выполняется, CreateFilter = nil
  begin
  .......
 end;
Админ: Пользуемся тегами!!!

Последний раз редактировалось Abracadabra, 11.01.2011 в 17:43.
Ответить с цитированием
  #2  
Старый 11.01.2011, 17:45
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

А что есть MYAPI2?
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #3  
Старый 11.01.2011, 17:46
Аватар для movnet
movnet movnet вне форума
Начинающий
 
Регистрация: 24.07.2008
Сообщения: 127
Версия Delphi: Delphi 7
Репутация: 23
По умолчанию

Динамическая и статическая загрузка DLL
Ответить с цитированием
  #4  
Старый 11.01.2011, 17:47
Abracadabra Abracadabra вне форума
Прохожий
 
Регистрация: 11.01.2011
Сообщения: 6
Репутация: 10
По умолчанию

MYAPI2 Это мой интерфейс
Ответить с цитированием
  #5  
Старый 11.01.2011, 17:50
Abracadabra Abracadabra вне форума
Прохожий
 
Регистрация: 11.01.2011
Сообщения: 6
Репутация: 10
По умолчанию

Я имею предсавление как подключается статически и динамически dll...проблема в том что не могу понять почему у меня не находит функцию, вроде же все правильно написано
Ответить с цитированием
  #6  
Старый 11.01.2011, 17:58
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

По предложенным огрызкам кода Вам врятли кто-то даст ответ. Или покажитель больше кода... или одно из двух. (с) Братья пилоты.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #7  
Старый 11.01.2011, 18:07
Abracadabra Abracadabra вне форума
Прохожий
 
Регистрация: 11.01.2011
Сообщения: 6
Репутация: 10
По умолчанию

Кода не так уж много...вот

Описание интерфейса
Код:
MYAPI2 = interface
['{FE84A03E-74F6-48B9-97B6-C9EC4ECFD174}']
 procedure ModifPicture(var p: TBitMap);
end;

Dll
Код:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin, ExtCtrls, Buttons, ColorGrd, Menus, ExtDlgs,InterfaceUnit;

{$R *.res}

type
  PictureFilter = class(TInterfacedObject, MYAPI2)
  procedure ModifPicture(var p: TBitMap);
end;

procedure PictureFilter.ModifPicture(var p: TBitMap);stdcall;
 var
  i,j:integer;
 begin
   for i := 0  to  p.Width-1 do
    for j:= 0 to  p.Height-1 do
      p.Canvas.Pixels[i,j]:=rgb(0,0,GetbValue(p.Canvas.Pixels[i,j]));
 end;

function CreateFilter:MYAPI2;stdcall;
 begin
  Result:= PictureFilter.Create;
 end;

exports
  CreateFilter;

begin
end.



Само приложение
Код:
type
  TForm1 = class(TForm)
    ColorGrid1: TColorGrid;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    Image1: TImage;
    SpinEdit1: TSpinEdit;
    SpeedButton4: TSpeedButton;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    OpenPictureDialog1: TOpenPictureDialog;
    SavePictureDialog1: TSavePictureDialog;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SpinEdit1Change(Sender: TObject);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SpeedButton4Click(Sender: TObject);

  public
   procedure LoadData;
  end;

 TCreateFilter = function: MYAPI2;

procedure TForm1.LoadData;

var
  p:Tbitmap;
  hPlugIn: THandle;
  CreateFilter: TCreateFilter;
  Filter: MYAPI2;
begin
 hPlugIn := LoadLibrary('plugin.dll');
 CreateFilter := GetProcAddress(hPlugIn,'CreateFilter');
 if Assigned(CreateFilter) then
 	 begin
	  Filter := CreateFilter;
    p:=image1.Picture.Bitmap;
    filter.ModifPicture(p);
    image1.Refresh;
   end;
end;

procedure TForm1.N6Click(Sender: TObject);
var
  i,j: Integer;
begin
  LoadData;
end;
Ответить с цитированием
  #8  
Старый 11.01.2011, 18:25
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Я не готов назвать себя ГУРУ (и ему подобному) в создании DLL, но я грешу на "RTTI у DLL и EXE разные". А именно твоё
Код:
procedure ModifPicture(var p: TBitMap);
, на мой взгляд в EXE и DLL получается разное (из-за класса TBitMap).
Я бы использовал HBITMAP.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #9  
Старый 11.01.2011, 18:47
Abracadabra Abracadabra вне форума
Прохожий
 
Регистрация: 11.01.2011
Сообщения: 6
Репутация: 10
По умолчанию

Попробовала изменить, но результат тот же CreateFilter=nil
Ответить с цитированием
  #10  
Старый 11.01.2011, 18:48
Аватар для movnet
movnet movnet вне форума
Начинающий
 
Регистрация: 24.07.2008
Сообщения: 127
Версия Delphi: Delphi 7
Репутация: 23
По умолчанию

Если динамическая библиотека в процессе работы использует переменные или функции, осуществляющие динамическое выделение памяти под собственные нужды (длинные строки, динамические массивы, функции New и GetMem), а также, если такие переменные передаются в параметрах и возвращаются в результатах, то в таких библиотеках обязательно должен использоваться модуль ShareMem. При этом в секции uses модуль должен располагаться на первом месте.
Ответить с цитированием
  #11  
Старый 11.01.2011, 19:03
Abracadabra Abracadabra вне форума
Прохожий
 
Регистрация: 11.01.2011
Сообщения: 6
Репутация: 10
По умолчанию

И это тоже не помогло
У меня задача в этой программе подключить плагины(плагины должны работать с изображением) через интерфейс Но я сама никогда не писала интерфейсы, и плагины не подключала... в инете видела множество статей на эту тему, но если чесно разобралась слабенько...вышла вот такая программа. Может есть у кого идея как можно по другому подключать плагин с помощью интерфейса
Ответить с цитированием
  #12  
Старый 11.01.2011, 19:15
Аватар для movnet
movnet movnet вне форума
Начинающий
 
Регистрация: 24.07.2008
Сообщения: 127
Версия Delphi: Delphi 7
Репутация: 23
По умолчанию

Тогда смотри сюда : Использование DLL в качестве Plug-in
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:37.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter