Форум: "Основная";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
ВнизКак описать CallBack функцию с С++ на Delphi Найти похожие ветки
← →
Zilog_ © (2006-07-24 14:50) [0]Вот описание на С++:
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);
Как это правильно реализовать на делфи?
← →
GrayFace © (2006-07-24 23:55) [1]Не все понятно - шапочно знаком с 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;
← →
atruhin © (2006-07-25 10:25) [2]> iaxc_event_callback_t = function(e:iaxc_event):integer;
Точнее:
iaxc_event_callback_t = function(e:piaxc_event):integer;
← →
GrayFace © (2006-07-26 04:50) [3]Тогда лучше
iaxc_event_callback_t = function(var e:iaxc_event):integer;
← →
GrayFace © (2006-07-26 04:51) [4]Хотя когда как.
← →
Zilog_ © (2006-07-26 07:08) [5]Не канают оба варианта вылетает AV...
← →
Zilog_ © (2006-07-26 08:33) [6]
> Не канают оба варианта вылетает 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
}
}
← →
Ketmar © (2006-07-26 13:45) [7]не надо гадать. надо курить маны. %-)
прежде всего -- это C. следовательно (с весьма большой вероятностью) callback-функция имеет соглашение cdecl. и уж 99.99% за то, что это не register, которое Delphi ставит по-умолчанию.
далее. очень полезно глянуть, не есть ли структура packed (#pragma align 1 или что-то в этом роде в начале сишного файла).
как минимум -- вот. а вообще -- сложно сказать. подземный стук, аднака...
← →
Zilog_ © (2006-07-26 13:48) [8]
> прежде всего -- это 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)
Эта срока и говорит о стандарте вызова функций? :-)
← →
Чапаев © (2006-07-26 13:56) [9]
> Эта срока и говорит о стандарте вызова функций? :-)
ага.
Поэтому при объявлении/описании функции добавляй stdcall... Впрочем, это актуально для 99% функций обратного вызова.
← →
Zilog_ © (2006-07-26 14:03) [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
← →
Ketmar © (2006-07-26 14:20) [11]а совсем не интересно. %-) неактуально. тем более забесплатно. %-)
← →
Zilog_ © (2006-07-26 14:29) [12]
> 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:46) [13]>Zilog_ © (26.07.06 14:29) [12]
> "ПАТРИОТИЗМ"
Нижний Тагил? это разве в Украине? %-)
> ХАЛЯВА для НАРОДА
у меня на сайте халявы достаточно, imo. оно даже более, чем халява -- public domain. и забесплатно. %-)
← →
Zilog_ © (2006-07-26 15:19) [14]
> Ketmar ©
Проникся уважением, имхо ZX-spectrum FOREVER!!!
> Нижний Тагил? это разве в Украине? %-)
Ага, на Урале тоже сало жрут!!! ;-)
← →
Zilog_ © (2006-07-26 15:30) [15]Странно директиву cdecl сеъла с удовольствие и больше не ругается ... будем дальше эксперементировать.
← →
Ketmar © (2006-07-26 16:32) [16]странно...
← →
Zilog_ © (2006-07-27 07:33) [17]Все разобрался!
Действительно CallBack процедура дожна соответствовать соглашению о вызовах в соответствии с директивой cdecl.
PS: Выражаю огромную благодарность всем, кто участвовал в обсуждении этой темы. :-) Особенно господину Ketmar ©, который направил меня на путь истинный.
← →
GrayFace © (2006-07-27 20:31) [18]Ketmar © (26.07.06 14:46) [13]
public domain
А что это?
← →
Ketmar © (2006-07-27 21:37) [19]>GrayFace © (27.07.06 20:31) [18]
способ раздачи такой. применительно к исходникам звучит так: "берите кто хочет, делайте, что хотите, моё авторство даже упоминать не обязательно".
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.049 c