![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Данные из 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, ...