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

Вниз

подключение dll   Найти похожие ветки 

 
alshtam   (2009-08-21 12:25) [0]

Здравствуйте, подскажите как можно подключить и выполнить процедуру в dll при условии что эта dll подключается с ранним подключением но эта процедура не объявлена при раннем подключении.
Нужно продедуру подключить поздним подключением


 
Сергей М. ©   (2009-08-21 12:39) [1]

type
 TMyDllProc = procedure;
..
var
 MyDllProc: TMyDllProc;
..

MyDllProc := GetProcAddress("MyDll.dll", "MyDllExportedProcName");
if Assigned(MyDllProc) then MyDllProc;


 
Юрий Зотов ©   (2009-08-21 12:39) [2]

1. Объявляем тип процедуры.
2. Получаем ее адрес (см. GetProcAddress)
3. Вызываем ее.


 
alshtam   (2009-08-21 13:01) [3]

да но GetProcAddress требует первым параметром cardinal(видимо хэндл)


 
Юрий Зотов ©   (2009-08-21 13:11) [4]

Если DLL уже загружена, то ее хэндл дает GetModuleHandle.
Если еще нет, то LoadLibrary.

Впрочем, LoadLibrary можно вызывать всегда. Если DLL уже загружена, то повторной загрузки не будет, просто получим ее хэндл.


 
alshtam   (2009-08-21 13:13) [5]

о, понял Спасибо!


 
alshtam   (2009-08-21 13:25) [6]

нет не получилось
вот код который я написал

     c:=GetModuleHandle("FRDrv.dll");
     InitIP := GetProcAddress(c, "InitIP");

В результате
@InitIP=nil

LoadLibrary вместо GetModuleHandle дал тот же результат
процедура точно есть в dll, я ее ранним связыванием вызываю успешно


 
Медвежонок Пятачок ©   (2009-08-21 13:27) [7]

где-то ошибка в программе


 
alshtam   (2009-08-21 13:28) [8]

c<>0


 
alshtam   (2009-08-21 13:31) [9]

а может такое что на этапе компеляции в EXE попадают тока указаные объявленые процедуры и потом просто к dll не обращается


 
Сергей М. ©   (2009-08-21 13:38) [10]


> c<>0


Если так, то это значит что среди экспортируемых dll процедур нет процедурs с именем InitIP.

При поиске экспортируемых имен регистр символов ИМЕЕТ значение.


 
Медвежонок Пятачок ©   (2009-08-21 14:14) [11]

а может такое что на этапе компеляции в EXE попадают тока указаные объявленые процедуры и потом просто к dll не обращается

а что, есть подозрение, что в программу "попадают" и неуказанные в интерфейсном модуле к длл процедуры?


 
stas ©   (2009-08-21 17:05) [12]

alshtam   (21.08.09 13:28) [8]
покажите код.


 
alshtam   (2009-08-24 05:06) [13]


> Если так, то это значит что среди экспортируемых 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;


 
Leonid Troyanovsky ©   (2009-08-24 08:04) [14]


> 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 10:06) [15]

Спасибо большое, все сделал, теперь работает как надо. Ключевым оказалось ненужное объявление stdcall.


 
Юрий Зотов ©   (2009-08-24 11:03) [16]

> alshtam   (24.08.09 10:06) [15]
> ненужное объявление stdcall.

Оно может быть нужным, а может быть и ненужным, все зависит от наших целей. В Вашем случае ошибка не в том, что оно есть, а в том, что оно есть в проекте, но его нет в DLL. А должно быть одинаково - либо оно есть везде, либо его нет нигде.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.045 c
2-1251020827
EXEcER
2009-08-23 13:47
2009.10.25
Рэндом в Label


2-1251500045
sanx
2009-08-29 02:54
2009.10.25
Для изменения boolean в мультипотокс нужны атомарные операции?


2-1251814973
Del
2009-09-01 18:22
2009.10.25
BDS 2006 hint


15-1250899237
Tirael
2009-08-22 04:00
2009.10.25
как называется игрушка


2-1251978697
Nilman
2009-09-03 15:51
2009.10.25
поменять внешний вид TComboBox





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