Форум: "Основная";
Текущий архив: 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