Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DLL, Использование DLL 
:(
    Опции темы
falcon39
Дата 14.9.2004, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 21.6.2004

Репутация: нет
Всего: 0



У меня есть DLL что она экспортирует я знаю но как этим пользоваться нет
--------------------
PM MAIL   Вверх
Pakshin A. S.
Дата 14.9.2004, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Первый вопрос: знаешь параметры финкции (входные/выходные) с их типами, т. е. точное описание функции?
PM   Вверх
Pakshin A. S.
  Дата 14.9.2004, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Ладно.. Напишу.
Код

// вариант №1
function <Имя функции>(<параметры функции с типами>):<результат функции>; external '<Имя Dll>' name '<имя функции в Dll>';

Код

// вариант №2
var
<Имя функции>: function (<параметра функции с типами>):<результат функции>;
Handle:word;
begin
Handle:=LoadLibrary('<Имя Dll>');
if Handle <> 0
  then
   begin
    @<имя функции>:=GetProcAddress(Handle, '<Имя функции в Dll>');
    // работаем
    FreeeLibrary(Handle);
   end;
end;


Вот кое-что по теме...
Добавлено @ 19:01
Отсюда очеь хорошо видно, что без знания параметров ничего не выйдет. (Доказано программистами biggrin.gif )

Это сообщение отредактировал(а) Pakshin A. S. - 14.9.2004, 19:00
PM   Вверх
Ripper
Дата 14.9.2004, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: 1
Всего: 23



а что выполняет функция LoadLibrary? Т.е. чем эти варианты отличаются ?


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
Pakshin A. S.
Дата 14.9.2004, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



1) Взяли функцию...
2) Для начала загрузили самотоятельно библиотеку и загрузили функцию...

Во втором варианте можно отследить ошибки: нет файла, нет функции (файл поврежден)...
PM   Вверх
p0s0l
Дата 14.9.2004, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата(Pakshin @ 14.9.2004, 20:32)
1) Взяли функцию... 2) Для начала загрузили самотоятельно библиотеку и загрузили функцию...

1 - Круто написано! smile.gif

1) Статическая загрузка - библиотека подключается при запуске приложения автоматически загрузчиком Винды. Если библиотеки нет, или функции там такой нет - облом, .exe не запустится
2) Динамическая загрузка - библиотека подключается нашей прогой когда мы этого захотим (хотя она уже может быть и подключена)... Если такой библиотеки нет, или функции, то мы сами сможем обработать эту ситуацию...

Добавлено @ 20:58
Также большинство DLL используют механизм вызова stdcall, поэтому скорее всего надо будет в конце приписать слово stdcall:
Код
// вариант №1
function <Имя функции>(<параметры функции с типами>):<результат функции>; stdcall; external '<Имя Dll>' name '<имя функции в Dll>';

Код
// вариант №2
var
<Имя функции>: function (<параметра функции с типами>):<результат функции>; stdcall;



--------------------
С уважением, г-н Посол.
PM   Вверх
falcon39
Дата 15.9.2004, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 21.6.2004

Репутация: нет
Всего: 0



Вот в этом то и вся проблемя.
Библиотека не моя по этому знаю только названия, а пораметры функций не знаю.
Если есть конечно возможность как нибудь их узнать то пожалуйсто помогите.
--------------------
PM MAIL   Вверх
_hunter
Дата 15.9.2004, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



уже была тут подобная тема
и вывод не утешительный: точно узнать не получится ( можно только на глаз прикинуть )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Ripper
Дата 15.9.2004, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: 1
Всего: 23



а можно в 2х слова что такое stdcall? я часто вижу эту надпись но в собственной длл без этого работает)



--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
Pakshin A. S.
Дата 15.9.2004, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Цитата(F1)

When you declare a procedure or function, you can specify a calling convention using one of the directives register, pascal, cdecl, stdcall, and safecall. For example,

function MyFunction(X, Y: Real): Real; cdecl;
...

Calling conventions determine the order in which parameters are passed to the routine. They also affect the removal of parameters from the stack, the use of registers for passing parameters, and error and exception handling. The default calling convention is register.

The register and pascal conventions pass parameters from left to right; that is, the left most parameter is evaluated and passed first and the rightmost parameter is evaluated and passed last. The cdecl, stdcall, and safecall conventions pass parameters from right to left.
For all conventions except cdecl, the procedure or function removes parameters from the stack upon returning. With the cdecl convention, the caller removes parameters from the stack when the call returns.

The register convention uses up to three CPU registers to pass parameters, while the other conventions pass all parameters on the stack.
The safecall convention implements exception "firewalls." On Windows, this implements interprocess COM error notification.

The table below summarizes calling conventions.

Calling conventions
Directive Parameter order Clean-up Passes parameters in registers?
register Left-to-right Routine Yes
pascal Left-to-right Routine No
cdecl Right-to-left Caller No
stdcall Right-to-left Routine No
safecall Right-to-left Routine No
The default register convention is the most efficient, since it usually avoids creation of a stack frame. (Access methods for published properties must use register.) The cdecl convention is useful when you call functions from shared libraries written in C or C++, while stdcall and safecall are recommended, in general, for calls to external code. On Windows, the operating system APIs are stdcall and safecall. Other operating systems generally use cdecl. (Note that stdcall is more efficient than cdecl.)

The safecall convention must be used for declaring dual-interface methods. The pascal convention is maintained for backward compatibility. For more information on calling conventions, see Program control.
The directives near, far, and export refer to calling conventions in 16-bit Windows programming. They have no effect in 32-bit applications and are maintained for backward compatibility only.

PM   Вверх
Ripper
Дата 15.9.2004, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: 1
Всего: 23



А на русском? Я конечно могу поковырсятся разобрать =) Но блин это не в 2х словах)
все равно спасиб завтра прочту...


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0557 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.