Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Вниз

Данные из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.038 c
1-1096054382
tormoz
2004-09-24 23:33
2004.10.10
Фокус ввода


1-1095915442
Lexxx
2004-09-23 08:57
2004.10.10
Помогите додумать ф-ю открытия txt файла, и все его содерж.


14-1095543110
GanibalLector
2004-09-19 01:31
2004.10.10
база примаков


1-1095698261
Pa5ha
2004-09-20 20:37
2004.10.10
Данные из DLL


4-1093879716
Hkr
2004-08-30 19:28
2004.10.10
Хук на показывание окна





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