Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Данные из DLL [D7, WinXP]


Pa5ha ©   (2004-09-20 20:37:00) 

Есть ДЛЛ (естествено я сам её написал). Работает в роли плагина. Надо как то передать в основную программу название плагина и тд. Все храниться в строках. Как эти строки оттуда извлечь?


Defunct   (2004-09-23 17:47:00) [1]

> Я видел плагин с формой 50 кб. Как это сделать, чтоб весило не 400 кб?

отказаться VCL, либо компилировать с опцией Build with runtime packages.


Pa5ha   (2004-09-23 17:44:00) [2]

Всё работает. Почему не работало - черт его знает. Ща буду думать. И ещё вопрос: а что либа такая большая? Плагины обычно весят меньше. И я форму хочу туда поместить. Я видел плагин с формой 50 кб. Как это сделать, чтоб весило не 400 кб?


Pa5ha   (2004-09-22 20:17:00) [3]

Да вроде ДЛЛ грузиться, одна функция вызывается и все. Ща попробую. Спасибо за помощь.


Defunct   (2004-09-22 18:17:00) [4]

Pa5ha   (22.09.04 17:55) [10]

Варианты того, что может быть не так:

1. Типы TPluginInfo поразному определены в DLL и в Host приложении.
2. Неправильно осуществляется выгрузка DLL (например, в DLL работает какой-то поток).


Defunct   (2004-09-22 18:04:00) [5]

Давайте попытаемся сделать все с нуля.

DLLка:

library infotest;

uses
 SysUtils,
 Classes;

{$R *.res}

Type TPluginInfo = packed Record
      Name    : ShortString;
      Version : ShortString;
      CDate   : ShortString;
    End;

Function PluginInfo: TPluginInfo;stdcall;
Begin
 Result.Name := 'infotest dll';
 Result.Version := '1.0';
 Result.CDate := FormatDateTime('hh:nn:ss dd-mm-yyyy', Now);
End;

Exports
PluginInfo;

end.


Хост приложение:

implementation

{$R *.dfm}
Type TPluginInfo = packed Record
      Name    : ShortString;
      Version : ShortString;
      CDate   : ShortString;
    End;

procedure TForm1.Button1Click(Sender: TObject);
Var S    : String;
   Info : TPluginInfo;
   F    : Function: TPluginInfo; stdcall;
   Hdll : HWnd;
begin
 HDll := LoadLibrary('infotest.dll');
 Try
   F := GetProcAddress( Hdll ,'PluginInfo');
   Info := F;
   S := Info.Name + #13+#10+ 'version: ' + Info.Version + #13+#10 +
        Info.CDate;
   ShowMessage(S);
 Finally
   FreeLibrary(HDll);
 End;
end;


Pa5ha   (2004-09-22 17:55:00) [6]


procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
hcDLL: tHandle;
FuncName: function: TPluginInfo; stdcall;
PlugInfo: TPluginInfo;
s:string;
begin
 Form1.FileListBox1.Directory:=ExtractFilePath(application.ExeName);
 form1.ListBox1.Items.Clear;
//  PlugInfo.name:='Pa5ha';
 for i:=0 to form1.filelistbox1.Items.Count-1 do
   begin
//      form1.ListBox1.Items.Add(ExtractFilePath(application.ExeName)+form1.FileListBox1.Items[i]);
     hcDLL:=LoadLibrary(PAnsiChar(ExtractFilePath(application.ExeName)+form1.FileListBox1.Items[i]));
     if hcDLL<=HINSTANCE_ERROR then
       begin
         ShowMessage('Can''t load library: '+ExtractFilePath(application.ExeName)+form1.FileListBox1.Items[i]);
       end else
       begin
         FuncName:=getProcAddress(hcDll,'GetPluginInfo');
           if assigned(FuncName)then
             begin
               PlugInfo:=FuncName;
               form1.ListBox1.Items.Add(PlugInfo.name);
//                ShowMessage('Loading is OK: '+form1.FileListBox1.Items[i]);
             end else
             begin
               ShowMessage('Plugin is not MFC plugin: '+form1.FileListBox1.Items[i]);
             end;
         FreeLibrary(hcDLL);
       end;
   end;
end;


Вот короче процедура, как есть. Ну и что же тут не так?


Pa5ha   (2004-09-22 11:14:00) [7]


var i:integer;
hcDLL: tHandle;
FuncName: function: TPluginInfo; stdcall;
PlugInfo: TPluginInfo;

вот мой вар. В общем процедура доходит до конца (вывдоит сообщение, расположенное перед енд.)и вылетает. Причем данные из либы передаются в программу и либа вроде даже выгружается.

FuncName тут не при чем.


Pa5ha   (2004-09-22 11:08:00) [8]

Access violtion at address 00404090 in module ''. Read of address B31E40.
Если закоментировать
PlugInfo := FuncName;
, то все работает.


Defunct   (2004-09-21 23:54:00) [9]

Pa5ha   (21.09.04 23:44) [5]

Поидее, если dll существует и внутри все в порядке, то должно работать следующее:

FuncName := GetProcAddress( LoadLibrary('ваша dll'), 'GetPluginInfo');
PlugInfo := FuncName;


Приведите код ошибки с которым вылетает программа.


Defunct   (2004-09-21 23:50:00) [10]

А где осуществяется загрузка dll?

hcDLL := ???

FuncName:=getProcAddress(hcDll,'GetPluginInfo');


Pa5ha   (2004-09-21 23:44:00) [11]

В догонку:
FuncName: function: TPluginInfo; stdcall;
PlugInfo: TPluginInfo;
Описание копии в основной программе.


Pa5ha   (2004-09-21 23:33:00) [12]

PlugInfo:=FuncName; - коментирую и всё пучком.
Есть Export и Exports. Первое сс пишется после stdcall, если ф-я экспортируется. (Вроде так).


Defunct   (2004-09-21 23:30:00) [13]

Export sпишется вообще-то в DLL

На чем ошибка вылетает?

где код DLLки?


Pa5ha   (2004-09-21 23:26:00) [14]

export; надо дописать (после stdcall;)?
И как функцию вызвать? У меня ошибка все время вылетает.

        FuncName:=getProcAddress(hcDll,'GetPluginInfo');
           if assigned(FuncName)then
             begin
               PlugInfo:=FuncName;
               form1.ListBox1.Items.Add(PlugInfo.name);
               FreeLibrary(hcDLL);
             end else
             begin
               ShowMessage('Plugin is not MFC plugin: '+form1.FileListBox1.Items[i]);
             end;
 

(либа грузиться нормально и адрес функции получается)


Defunct   (2004-09-20 21:07:00) [15]

TPluginInfo = packed Record
 name   : ShortString;
 и т.д. : ShortString;
End;

Function GetPluginInfo:TPluginInfo;stdcall;

Exports
GetPluginInfo, ...


Наверх

Титульная страница Поиск, карта сайта Написать письмо