Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.056 c
15-1155104429
McSimm
2006-08-09 10:20
2006.09.10
Turbo News


1-1153808383
atruhin
2006-07-25 10:19
2006.09.10
Модальное окно в MDI приложении


3-1151581247
Ищущий
2006-06-29 15:40
2006.09.10
данные хранимки как основа


15-1155957112
СергунчиК
2006-08-19 07:11
2006.09.10
Какой телефон купить


15-1155559772
rimm
2006-08-14 16:49
2006.09.10
Потоки и поточные преложения...





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