Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Импортирование методов DLL


Автор: altarasjuk 3.6.2003, 16:26
Всем привет!
Ситуация такова:
есть DLL. Из неё импортируются функции. Но проблема в том, что имя DLL (путь) до запуска exe не известно.
Код
procedure Some(); external 'C:\......\......\.....dll';

Относительные пути не пойдут. Как это нужно импортировать в таком случае?

Автор: <Spawn> 3.6.2003, 17:10
Как так неизвестно? Ты уж определись где она будет лежать или скажи более точно причину, почему неизвестен путь.

Автор: eof 3.6.2003, 17:38
<Spawn> Ну например имя библиотеки и путь может передаваться при запуске программы в виде параметров, или указываться в настройках (в одном из клиентбанков видел такой диалог, он назывался "путь к бизнеслогике"), вариантов довольно много...

Автор: altarasjuk 3.6.2003, 17:39
Причина такова: Это значение будет браться из реестра, куда его записует другая программа. А эта программа может находиться в произвольном месте (но стоять она будет точно).

Автор: altarasjuk 3.6.2003, 17:40
eof полностью согласен

Автор: <Spawn> 3.6.2003, 17:42
А ты прочитать это значение реестра не можешь? А если можешь, то в чем тогда проблема?

Автор: altarasjuk 3.6.2003, 17:46
Я ем сорри smile.gif но я вроде как написал, может, эли что не так, то уж простите....
Вопрос такой как динамически подставлять значения вместо 'C:\......\......\.....dll'?

Автор: eof 3.6.2003, 17:48
как подгрузить dll во время выполнения проги.

Автор: <Spawn> 3.6.2003, 17:50
Цитата(altarasjuk @ 3.6.2003, 09:46)
Я ем сорри smile.gif но я вроде как написал, может, эли что не так, то уж простите....
Вопрос такой как динамически подставлять значения вместо 'C:\......\......\.....dll'?

Что то я не совсем пойму. Но, если ты можешь прочесть данные реестра, то подгружаешь ДЛЛ при помощи LoadLibrary (SafeLoadLibrary) и извлекаешь нужные тебе функции.

Автор: eof 3.6.2003, 17:53
Код
For example, on Windows or Linux:

uses Windows, ...; {On Linux, replace Windows with SysUtils }
type
 TTimeRec = record
   Second: Integer;
   Minute: Integer;
   Hour: Integer;
 end;
 TGetTime = procedure(var Time: TTimeRec);
 THandle = Integer;
var
 Time: TTimeRec;
 Handle: THandle;
 GetTime: TGetTime;
 ...
begin
 Handle := LoadLibrary('libraryname');
 if Handle <> 0 then
 begin
   @GetTime := GetProcAddress(Handle, 'GetTime');

   if @GetTime <> nil then
   begin
     GetTime(Time);
     with Time do
       WriteLn('The time is ', Hour, ':', Minute, ':', Second);
   end;
   FreeLibrary(Handle);
 end;
end;

только что нашел в helpe... долго искалsmile.gif

Автор: altarasjuk 3.6.2003, 17:54
А можно подробнее по поводу SafeLoadLibrary?

Автор: <Spawn> 3.6.2003, 17:59
То же самое что и LoadLibrary, но выполняет безопасную загрузку ДЛЛ.

Safe and simple library loading.

Unit

SysUtils

Category

Package support routines

Delphi syntax:

On Windows:

function SafeLoadLibrary(const Filename: string; ErrorMode: UINT = SEM_NOOPENFILEERRORBOX): HMODULE;

On Linux:

function SafeLoadLibrary(const FileName: string; Dummy: LongWord = 0): HMODULE;

C++ syntax:

On Windows:

extern PACKAGE HMODULE __fastcall SafeLoadLibrary(const AnsiString Filename, unsigned ErrorMode = SEM_NOOPENFILEERRORBOX);

On Linux:

extern PACKAGE unsigned __fastcall SafeLoadLibrary(const AnsiString FileName, unsigned Dummy = 0);

Description

SafeLoadLibrary loads a Windows DLL or Linux shared object file, as specified by Filename. SafeLoadLibrary preserves the current FPU control word, preventing library initialization code from permanently overwriting precision and exception masks.

Автор: eof 3.6.2003, 18:01
так они и перепечатали весь хелп smile.gif

Автор: altarasjuk 3.6.2003, 18:02
сенкю smile.gif

Автор: altarasjuk 3.6.2003, 18:05
eof
Цитата
так они и перепечатали весь хелп 

Не надо издеваться - я уже 2 дня сижу без хелпа, пришлось убить sad.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)