![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
подключение dll
alshtam © (2009-08-21 12:25:00)Здравствуйте, подскажите как можно подключить и выполнить процедуру в dll при условии что эта dll подключается с ранним подключением но эта процедура не объявлена при раннем подключении.
Нужно продедуру подключить поздним подключением
Юрий Зотов (2009-08-24 11:03:00) [1]> alshtam (24.08.09 10:06) [15]
> ненужное объявление stdcall.
Оно может быть нужным, а может быть и ненужным, все зависит от наших целей. В Вашем случае ошибка не в том, что оно есть, а в том, что оно есть в проекте, но его нет в DLL. А должно быть одинаково - либо оно есть везде, либо его нет нигде.
alshtam (2009-08-24 10:06:00) [2]Спасибо большое, все сделал, теперь работает как надо. Ключевым оказалось ненужное объявление stdcall.
Leonid Troyanovsky (2009-08-24 08:04:00) [3]
> alshtam (24.08.09 05:06) [13]
> TInitIP=procedure (pass:integer;ip:string;port,numberOfCass,
> timeOut:integer);stdcall;
stdcall здесь лишнее.
Если библиотека использует string, то первым в uses и
в приложении и библиотеке д.б. ShareMem.
> c:=GetModuleHandle('FRDrv.dll');
LoadLibrary здесь предпочтительней.
Win32Check(c <> 0);
> @InitIP:= GetProcAddress(c, 'initIP');
Win32Check(Assigned(InitIP));
--
Regards, LVT.
alshtam (2009-08-24 05:06:00) [4]
> Если так, то это значит что среди экспортируемых dll процедур
> нет процедурs с именем InitIP.
нет точно есть, раним связыванием я процедуру запускаю успешно
> При поиске экспортируемых имен регистр символов ИМЕЕТ значение.
через буфер прям скопировал из исходника Dll
> а что, есть подозрение, что в программу "попадают" и неуказанные
> в интерфейсном модуле к длл процедуры?
не я имел ввиду что я часть процедур из этой dll объявил ранним связыванием. а потом то что не обьявлено,при позднем связывании уже не цепляется потому что, например, к библиотеке не обращается.
> покажите код.
В DLL:
procedure initIP(pass:integer;ip:string;port,numberOfCass,timeOut:integer);
begin
...
...
end;
"exports
initIP,
init,..."
В программе
объявление типа
type
TInitIP=procedure (pass:integer;ip:string;port,numberOfCass,timeOut:integer);stdcall;
....
....
InitIP:TInitIP;
....
...
c:=GetModuleHandle('FRDrv.dll');
@InitIP:= GetProcAddress(c, 'initIP');
if Assigned(InitIP) then
begin
...
...
end;
stas (2009-08-21 17:05:00) [5]alshtam (21.08.09 13:28) [8]
покажите код.
Медвежонок Пятачок (2009-08-21 14:14:00) [6]а может такое что на этапе компеляции в EXE попадают тока указаные объявленые процедуры и потом просто к dll не обращается
а что, есть подозрение, что в программу "попадают" и неуказанные в интерфейсном модуле к длл процедуры?
Сергей М. (2009-08-21 13:38:00) [7]
> c<>0
Если так, то это значит что среди экспортируемых dll процедур нет процедурs с именем InitIP.
При поиске экспортируемых имен регистр символов ИМЕЕТ значение.
alshtam (2009-08-21 13:31:00) [8]а может такое что на этапе компеляции в EXE попадают тока указаные объявленые процедуры и потом просто к dll не обращается
alshtam (2009-08-21 13:28:00) [9]c<>0
Медвежонок Пятачок (2009-08-21 13:27:00) [10]где-то ошибка в программе
alshtam (2009-08-21 13:25:00) [11]нет не получилось
вот код который я написал
c:=GetModuleHandle('FRDrv.dll');
InitIP := GetProcAddress(c, 'InitIP');
В результате
@InitIP=nil
LoadLibrary вместо GetModuleHandle дал тот же результат
процедура точно есть в dll, я ее ранним связыванием вызываю успешно
alshtam (2009-08-21 13:13:00) [12]о, понял Спасибо!
Юрий Зотов (2009-08-21 13:11:00) [13]Если DLL уже загружена, то ее хэндл дает GetModuleHandle.
Если еще нет, то LoadLibrary.
Впрочем, LoadLibrary можно вызывать всегда. Если DLL уже загружена, то повторной загрузки не будет, просто получим ее хэндл.
alshtam (2009-08-21 13:01:00) [14]да но GetProcAddress требует первым параметром cardinal(видимо хэндл)
Сергей М. (2009-08-21 12:39:00) [15]type
TMyDllProc = procedure;
..
var
MyDllProc: TMyDllProc;
..
MyDllProc := GetProcAddress('MyDll.dll', 'MyDllExportedProcName');
if Assigned(MyDllProc) then MyDllProc;
Юрий Зотов (2009-08-21 12:39:00) [16]1. Объявляем тип процедуры.
2. Получаем ее адрес (см. GetProcAddress)
3. Вызываем ее.