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

Вниз

Помогите плиз с 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.009 c
14-1124101892
Narik
2005-08-15 14:31
2005.09.11
войти в систему не зная пароль...


14-1124284049
QuasiLamo
2005-08-17 17:07
2005.09.11
Комбобокс в HTML


1-1124779960
ChILP
2005-08-23 10:52
2005.09.11
rxStrUtils


14-1123928157
Kerk
2005-08-13 14:15
2005.09.11
[Опрос] Свой коммерческий проект


1-1124358762
PalPalych
2005-08-18 13:52
2005.09.11
I/O error 123





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