![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как описать CallBack функцию с С++ на Delphi [D7]
Zilog_ © (2006-07-24 14:50:00)Вот описание на С++:
typedef struct iaxc_event_struct {
struct iaxc_event_struct *next;
int type;
union {
struct iaxc_ev_levels levels;
struct iaxc_ev_text text;
struct iaxc_ev_call_state call;
struct iaxc_ev_netstats netstats;
struct iaxc_ev_url url;
struct iaxc_ev_video video;
struct iaxc_ev_registration reg;
} ev;
} iaxc_event;
typedef int (*iaxc_event_callback_t)(iaxc_event e);
EXPORT void iaxc_set_event_callback(iaxc_event_callback_t func);
Как это правильно реализовать на делфи?
Ketmar (2006-07-27 21:37:00) [1]>GrayFace © (27.07.06 20:31) [18]
способ раздачи такой. применительно к исходникам звучит так: "берите кто хочет, делайте, что хотите, моё авторство даже упоминать не обязательно".
GrayFace (2006-07-27 20:31:00) [2]Ketmar © (26.07.06 14:46) [13]
public domain
А что это?
Zilog_ (2006-07-27 07:33:00) [3]Все разобрался!
Действительно CallBack процедура дожна соответствовать соглашению о вызовах в соответствии с директивой cdecl.
PS: Выражаю огромную благодарность всем, кто участвовал в обсуждении этой темы. :-) Особенно господину Ketmar ©, который направил меня на путь истинный.
Ketmar (2006-07-26 16:32:00) [4]странно...
Zilog_ (2006-07-26 15:30:00) [5]Странно директиву cdeclсеъла с удовольствие и больше не ругается ... будем дальше эксперементировать.
Zilog_ (2006-07-26 15:19:00) [6]
> Ketmar ©
Проникся уважением, имхо ZX-spectrum FOREVER!!!
> Нижний Тагил? это разве в Украине? %-)
Ага, на Урале тоже сало жрут!!! ;-)
Ketmar (2006-07-26 14:46:00) [7]>Zilog_ © (26.07.06 14:29) [12]
> "ПАТРИОТИЗМ"
Нижний Тагил? это разве в Украине? %-)
> ХАЛЯВА для НАРОДА
у меня на сайте халявы достаточно, imo. оно даже более, чем халява -- public domain. и забесплатно. %-)
Zilog_ (2006-07-26 14:29:00) [8]
> Ketmar © (26.07.06 14:20) [11]
> а совсем не интересно. %-) неактуально. тем более забесплатно.
> %-)
А слово "ПАТРИОТИЗМ" и ХАЛЯВА для НАРОДА ниочем не гворит? ;-)
....
Попробовал указать:
iaxc_event_callback_t = function(e:Тiaxc_event):integer; stdcall;
Теперь можно работать с e:Тiaxc_event, но все равно при выходе из функции обработки вылетает AV?
Ketmar (2006-07-26 14:20:00) [9]а совсем не интересно. %-) неактуально. тем более забесплатно. %-)
Zilog_ (2006-07-26 14:03:00) [10]Еще если-бы стандарт был бы не stdcall, то остальные функции не вызывались бы ....
Сечас работает все на половину:
клиент проходит инициализацию, регистрируется на сервере.
При звонке клиенту сервер создает каналы передачи данных ...
Но, так - как я немогу обробатывать сообщения, то дальше мои изыскания зашли в тупик...
А так, для кого интересно поломать голову с бибилиотекой VoIP телефонии, то сырец библиотеки:
https://svn.sourceforge.net/svnroot/iaxclient/trunk/iaxclient
Сервер для экспериментов (IP PBX):
http://www.asteriskwin32.com/
поддерживает: SIP, IAX, H.323 протоколы
Мои изыскания будут минут через пять по адресу
www.tagiltorg.ru/kurs/iaxclient.pas
www.tagiltorg.ru/kurs/iaxclient.dll
Чапаев (2006-07-26 13:56:00) [11]
> Эта срока и говорит о стандарте вызова функций? :-)
ага.
Поэтому при объявлении/описании функции добавляй stdcall... Впрочем, это актуально для 99% функций обратного вызова.
Zilog_ (2006-07-26 13:48:00) [12]
> прежде всего -- это C. следовательно (с весьма большой вероятностью)
> callback-функция имеет соглашение cdecl. и уж 99.99% за
> то, что это не register, которое Delphi ставит по-умолчанию.
>
> далее. очень полезно глянуть, не есть ли структура packed
> (#pragma align 1 или что-то в этом роде в начале сишного
> файла).
> как минимум -- вот. а вообще -- сложно сказать. подземный
> стук, аднака...
Вот заголовок всего фала:
* Copyrights:
* Copyright (C) 2003 HorizonLive.com, (c) 2004, Horizon Wimba, Inc.
*
* Contributors:
* Steve Kann <stevek@stevek.com>
* Frik Strecker <frik@gatherworks.com>
*
* This program is free software, distributed under the terms of
* the GNU Lesser (Library) General Public License
*/
#ifndef _iaxclient_h
#define _iaxclient_h
#ifdef __cplusplus
extern "C" {
#endif
/* This is the include file which declared all external API functions to
* IAXCLIENT. It should include all functions and declarations needed
* by IAXCLIENT library users, but not include internal structures, or
* require the inclusion of library internals (or sub-libraries) */
#include <stdio.h>
#if defined(WIN32) || defined(_WIN32_WCE)
#include <windows.h>
#include <winsock.h>
#else
#include <sys/socket.h>
#endif
#ifdef BUILDING_DLL
#if defined(WIN32) || defined(_WIN32_WCE)
# define EXPORT __stdcall __declspec(dllexport)
#else
# define EXPORT
#endif
#else
# define EXPORT
#endif
#if defined(WIN32) || defined(_WIN32_WCE)
#if defined(_MSC_VER)
typedef int (__stdcall *iaxc_sendto_t)(SOCKET, const char *, int, int, const struct sockaddr *, int);
typedef int (__stdcall *iaxc_recvfrom_t)(SOCKET, char *, int, int, struct sockaddr *, int *);
#else
typedef int PASCAL (*iaxc_sendto_t)(SOCKET, const char *, int, int, const struct sockaddr *, int);
typedef int PASCAL (*iaxc_recvfrom_t)(SOCKET, char *buf, int len, int flags, struct sockaddr *from, int *fromlen);
#endif
#else
typedef int (*iaxc_sendto_t)(int, const void *, size_t, int, const struct sockaddr *, socklen_t);
typedef int (*iaxc_recvfrom_t)(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);
#endif
Как я понимаю:
# define EXPORT __stdcall __declspec(dllexport)
Эта срока и говорит о стандарте вызова функций? :-)
Ketmar (2006-07-26 13:45:00) [13]не надо гадать. надо курить маны. %-)
прежде всего -- это C. следовательно (с весьма большой вероятностью) callback-функция имеет соглашение cdecl. и уж 99.99% за то, что это не register, которое Delphi ставит по-умолчанию.
далее. очень полезно глянуть, не есть ли структура packed (#pragma align 1 или что-то в этом роде в начале сишного файла).
как минимум -- вот. а вообще -- сложно сказать. подземный стук, аднака...
Zilog_ (2006-07-26 08:33:00) [14]
> Не канают оба варианта вылетает AV...
При попытке обратиться к e.typ
Попробовал по тупому описать так:
iaxc_event_callback_t = function(next:pointer; typ:integer; data:pointer)integer;
При чтении typ, AV не вылетает, но и сообщение приходт только с одним типом 1044.... Видимо, может в С++ передается не указатель на структуру, а структура разбиватеся по отдельным переменным и таким образом формируется функция с передаваемыми параметрами?
Вообще в программе использующей эту библиотеку обработка событий следующая:
int iaxc_callback(iaxc_event e)
{
switch(e.type) {
case IAXC_EVENT_LEVELS:
return levels_callback(e.ev.levels.input, e.ev.levels.output);
case IAXC_EVENT_TEXT:
return status_callback(e.ev.text.message);
case IAXC_EVENT_STATE:
return HandleStateEvent(e.ev.call);
// case IAXC_EVENT_STATE:
// ret = status_callback(e->ev.call);
// break;
default:
return 0; // not handled
}
}
Zilog_ (2006-07-26 07:08:00) [15]Не канают оба варианта вылетает AV...
GrayFace (2006-07-26 04:51:00) [16]Хотя когда как.
GrayFace (2006-07-26 04:50:00) [17]Тогда лучше
iaxc_event_callback_t = function(var e:iaxc_event):integer;
atruhin (2006-07-25 10:25:00) [18]> iaxc_event_callback_t = function(e:iaxc_event):integer;
Точнее:
iaxc_event_callback_t = function(e: piaxc_event):integer;
GrayFace (2006-07-24 23:55:00) [19]Не все понятно - шапочно знаком с C++.
union - это значит, что содержимое в нем рассматривается как что-то из перечисленных, а размер всего union'а = max размеру перечисленных в нем структур?
Еще кое-что не понатно, но примерно так:
type
Piaxc_event = ^iaxc_event;
iaxc_event = record
next:Piaxc_event;
typ{type нельзя использовать}:integer;
case integer of
1: levels:iaxc_ev_levels;
2: text:iaxc_ev_text
...
end;
end;
iaxc_event_callback_t = function(e:iaxc_event):integer;