Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.11;
Скачать: CL | DM;

Вниз

Помогите плиз с C   Найти похожие ветки 

 
Piter ©   (2005-08-17 22:44) [0]

Читаю тут о том, как делать плагины к миранде, инфа в основном на C, кое что-непонятно.

Miranda - это програма-messenger, в том числе и для сети ICQ.
Плагины к ней - обычные DLL.

Вот что пишут:

#define MIRAPI extern "C" __declspec(dllexport)
extern "C"
{
  #include "../../../sdk/headers_c/newpluginapi.h"
  #include "../../../sdk/headers_c/m_clist.h"
  #include "../../../sdk/headers_c/m_skin.h"
}


Здесь в первой строке объявляется макрос MIRAPI, который в дальнейшем будет использоваться в качестве модификатора при объявлении экспортированных функций. Суть этого макроса — экспортировать функцию и установить для нее компоновку в стиле С, что необходимо для распознания ее мирандой

честно говоря, не понимаю это предложение. Что за модификатор для объявления экспортированных функций? И как тогда экспортировать функции в Delphi библиотеки, чтобы все совместилось?

И далее объявляют экспортируемые функции с помощью этого макроса:

MIRAPI int Load(PLUGINLINK *link)
{
  pluginLink = link;


Короче, не понимаю я этих премудростей - может кто разъяснит?

P.S. Линк вот - http://miranda.pp.ru/forum/viewtopic.php?t=37&sid=d1349df9770a93cc4555fc9b0e5f6ce5


 
Eraser ©   (2005-08-17 22:46) [1]

Piter ©   (17.08.05 22:44)

Я так понимаю, чтобы писать в делфи нужно просто объявлять ф-ии как cdecl.


 
DrPass ©   (2005-08-17 23:08) [2]


> Короче, не понимаю я этих премудростей - может кто разъяснит?

Ничего хитрого - просто вместо MIRAPI подставляется extern "C" __declspec(dllexport). Это просто объявление экспортируемой из DLL функции, и чтобы было без сиплюсплюсного переименования


 
Piter ©   (2005-08-17 23:17) [3]

DrPass ©   (17.08.05 23:08) [2]

ага, понятно. То есть, это и есть обычный stdcall


 
Джо ©   (2005-08-17 23:24) [4]


>  [3] Piter ©   (17.08.05 23:17)
> DrPass ©   (17.08.05 23:08) [2]
>
> ага, понятно. То есть, это и есть обычный stdcall

Нет, это есть обычный cdecl.


 
Piter ©   (2005-08-17 23:27) [5]

А Eraser, судя по всему, прав.
Данная конструкция именно обозначает тип вызова как cdecl.

Странно... зачем разработчики Miranda отошли от общепринятого stdcall?


 
Piter ©   (2005-08-17 23:27) [6]

Джо ©   (17.08.05 23:24) [4]

ага, понял уже...


 
jack128 ©   (2005-08-17 23:29) [7]

Piter ©   (17.08.05 23:27) [5]
Странно... зачем разработчики Miranda отошли от общепринятого stdcall?

Ну например разработчики IB тоже отошли от "общепринятого" stdcall. Может фишка в том, что stdcall не так уж и общепринят?? ;)


 
Piter ©   (2005-08-17 23:43) [8]

jack128 ©   (17.08.05 23:29) [7]

хм. Может.
Но тот же Рихтер утверждает, что именно для библиотек - это как стандарт.
И рекомендует пользоваться именно этим типом вызова, чтобы не вносить неясности.

Все таки стоит признать, что большинство виндовых библиотек именно так работают.
Так зачем делать по другому?

Ведь другой тип вызова, насколько я понимаю, не несет никаких преимущество (впрочем, как и недостатков)...


 
Alexander Panov ©   (2005-08-17 23:50) [9]

Piter ©   (17.08.05 23:43) [8]

Насколько мне помнится, для С как раз CDECL и является стандартом. Windows и его библиотеки тут совершенно ни при чем.
Microsoft решила, что у нее будет stdcall. Это ее право.


 
GuAV ©   (2005-08-18 00:09) [10]


> Ведь другой тип вызова, насколько я понимаю, не несет
> никаких преимущество (впрочем, как и недостатков)...

Преимущества cdecl в возможности переменного числа аргументов, однако она менее эффективна (по производительности) чем stdcall. Register намного эффективнее, MS наверно отказались от такого способа чтобы не создавать лишних правил, какой тип когда передаётся в регистре, порядок регистров, etc.
Ещё преимущество stdcall, что если составить record из параметров и указать {$A4} стек м.б. приведен к такому record.
pascal - почти stdcall, только наоборот, и некоторые типы не по значению а по ссылке, что эффективнее.


 
Piter ©   (2005-08-18 00:41) [11]

GuAV ©   (18.08.05 0:09) [10]
Register намного эффективнее


Delphi рулит :)


 
DrPass ©   (2005-08-18 00:56) [12]

__fastcall тоже :)



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

Текущий архив: 2005.09.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
8-1114516145
Davinchi
2005-04-26 15:49
2005.09.11
где взять компонент сжатия MP3???


3-1122783260
makzn
2005-07-31 08:14
2005.09.11
DBF -> TextFile


2-1123500160
Storm
2005-08-08 15:22
2005.09.11
SQL Server


1-1124462191
murz
2005-08-19 18:36
2005.09.11
Сжатие приложений


14-1124268236
vidiv
2005-08-17 12:43
2005.09.11
Как узнать какие функции в dll-ке