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

Вниз

Данные из DLL   Найти похожие ветки 

 
Pa5ha   (2004-09-20 20:37) [0]

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


 
Defunct ©   (2004-09-20 21:07) [1]

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

Function GetPluginInfo:TPluginInfo;stdcall;

Exports
GetPluginInfo, ...


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

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-21 23:30) [3]

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

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

где код DLLки?


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

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


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

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


 
Defunct ©   (2004-09-21 23:50) [6]

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

hcDLL := ???

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


 
Defunct ©   (2004-09-21 23:54) [7]

Pa5ha   (21.09.04 23:44) [5]

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

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


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


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

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


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


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

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

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


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


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;


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


 
Defunct ©   (2004-09-22 18:04) [11]

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

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;


 
Defunct ©   (2004-09-22 18:17) [12]

Pa5ha   (22.09.04 17:55) [10]

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

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


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

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


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

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


 
Defunct ©   (2004-09-23 17:47) [15]

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.10.10;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.031 c
9-1086861113
Andr
2004-06-10 13:51
2004.10.10
Про нормали в OpenGL


14-1095917397
pavel_guzhanov
2004-09-23 09:29
2004.10.10
Ассемблер


1-1095828547
_sulent
2004-09-22 08:49
2004.10.10
&amp;#1064;&amp;#1088;&amp;#1080;&amp;#1092;&amp;#1090;


1-1095715640
lipskiy
2004-09-21 01:27
2004.10.10
Функция поиска подстроки в строке на asmе


14-1096016865
Prohodil Mimo
2004-09-24 13:07
2004.10.10
Забыл как задать колонке имя.