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

Вниз

А как это на Delphi будет?   Найти похожие ветки 

 
Sun bittern ©   (2004-04-05 07:15) [0]

Все доброго дня! Необходимо перевести маленький кусочек с C++ на Delphi. Заранее благодарствую!

macros

#if defined(WIN32) || defined(_WIN32)
#define XA_EXPORT __stdcall
#else
#define XA_EXPORT
#endif

typedef struct XA_AnalyzerCallbackClient XA_AnalyzerCallbackClient;
typedef int (*XA_AnalyzerCallbackFunction)(XA_AnalyzerCallbackClient *client,
                                          XA_AnalyzerMpegFrameInfo *frame);

typedef struct XA_Analyzer XA_Analyzer;

Очепятка? Может одна *. Хотя при компеляции под C++ не ругался
int XA_EXPORT xanalyzer_new(XA_Analyzer **analyzer);


 
Suntechnic ©   (2004-04-05 08:23) [1]

>Sun bittern ©   (05.04.04 07:15)
Где ты тут плюсы увидел? Типичный сишный код.
Первым объявлен тип указателя на ф-цию. Я не большой знаток  Delphi (пусть поправят те, кто знает лучше), но должно быть что-то типа:
type XA_AnalyzerCallbackFunction=function(var client : XA_AnalyzerCallbackClient; var frame : XA_AnalyzerMpegFrameInfo) : integer;

Для типа XA_AnalyzerCallbackClient здесь сделано только объявление вперёд, но описание типа в приведенном куске отсутствует. Тоже самое касается типа XA_Analyzer. Тип XA_AnalyzerMpegFrameInfo вообще упомянут только один раз.

Второе объявление это прототип ф-ции, которая судя по названию размещает объект типа XA_Analyzer в памяти. Кстати никакой ошибки нет. Именно две звезды для того чтобы вернуть указатель с новым адресом. Что есть две звезды для Delphi пусть скажут те, кто в Delphi больше разбирается. Для Win 32 во втором объявлении надо будет ещё добавить stdcall.


 
Sun bittern ©   (2004-04-05 08:52) [2]

Полный заголовочный файл

/*****************************************************************
|
|      MPEG Audio Analyzer
|
|      (c) 1996-2000 Xaudio Corporation
|      Author: Gilles Boccon-Gibod (gilles@xaudio.com)
|
****************************************************************/

#ifndef _XANALYSE_H_
#define _XANALYZE_H_

/*----------------------------------------------------------------------
|       macros
+---------------------------------------------------------------------*/
#if defined(WIN32) || defined(_WIN32)
#define XA_EXPORT __stdcall
#else
#define XA_EXPORT
#endif                              

/*-------------------------------------------------------------------------
|       error codes
+-------------------------------------------------------------------------*/
#define XANALYZE_SUCCESS                ( 0)
#define XANALYZE_FAILURE                (-1)

#define XANALYZE_ERROR_INTERNAL         (-2)
#define XANALYSE_ERROR_OUT_OF_MEMORY    (-3)
#define XANALYZE_ERROR_NO_SUCH_FILE     (-4)
#define XANALYZE_ERROR_CANNOT_OPEN      (-5)
#define XANALYZE_ERROR_INVALID_FRAME    (-6)
#define XANALYZE_ERROR_EOS              (-7)
#define XANALYZE_ERROR_STOP_CONDITION   (-8)
#define XANALYZE_ERROR_WATCHDOG         (-9)

#define XANALYZE_INVALID_VALUE          (-1)
#define XANALYZE_ALL_FRAMES             (0)

#define XANALYZE_CALLBACK_CONTINUE      (0)
#define XANALYZE_CALLBACK_STOP          (-1)

#define XANALYZE_TRUE                   1
#define XANALYZE_FALSE                  0

/*-------------------------------------------------------------------------
|       constants
+-------------------------------------------------------------------------*/
#define MPEG_ID_MPEG_1                          1
#define MPEG_ID_MPEG_2                          0
#define MPEG_ID_MPEG_2_5                        2

#define MPEG_MODE_STEREO                        0
#define MPEG_MODE_JOINT_STEREO                  1
#define MPEG_MODE_DUAL_CHANNEL                  2
#define MPEG_MODE_SINGLE_CHANNEL                3

#define XANALYZE_REPORT_CHANGING_LEVEL          0x001
#define XANALYZE_REPORT_CHANGING_LAYER          0x002
#define XANALYZE_REPORT_CHANGING_BITRATE        0x004
#define XANALYZE_REPORT_CHANGING_FREQUENCY      0x008
#define XANALYZE_REPORT_CHANGING_MODE           0x010
#define XANALYZE_REPORT_CHANGING_CHANNELS       0x020
#define XANALYZE_REPORT_HAS_META_DATA           0x040
#define XANALYZE_REPORT_HAS_ID3V1_HEADER        0x080
#define XANALYZE_REPORT_HAS_ID3V2_HEADER        0x100

#define XANALYZE_REPORT_ANY_CHANGE_MASK         0x3F

/*-------------------------------------------------------------------------
|       target specific macros
+-------------------------------------------------------------------------*/
#if defined(WIN32) || defined(_WIN32)
#define XA_EXPORT __stdcall
#define XA_IMPORT __stdcall
#else
#define XA_EXPORT
#define XA_IMPORT
#endif                                      

/*-------------------------------------------------------------------------
|       types
+-------------------------------------------------------------------------*/
typedef struct {
   int  level;
   int  layer;
   int  bitrate;
   int  frequency;
   int  mode;
   int  channels;
} XA_AnalyzerMpegInfo;

typedef struct {
   unsigned int         index;
   XA_AnalyzerMpegInfo  info;
   unsigned int         offset;
   unsigned int         nb_samples;
} XA_AnalyzerMpegFrameInfo;

typedef struct {
   const char   *title;
   const char   *artist;
   const char   *album;
   const char   *year;
   const char   *comment;
   unsigned char genre;
} XA_AnalyzerTrackInfo;

typedef struct {
   XA_AnalyzerMpegInfo  stream_type;
   XA_AnalyzerTrackInfo track;
   unsigned long        frames;
   unsigned long        duration;
   unsigned long        flags;
} XA_AnalyzerInfo;

typedef struct XA_AnalyzerCallbackClient XA_AnalyzerCallbackClient;
typedef int (*XA_AnalyzerCallbackFunction)(XA_AnalyzerCallbackClient *client,
                                          XA_AnalyzerMpegFrameInfo *frame);

typedef struct XA_Analyzer XA_Analyzer;

/*-------------------------------------------------------------------------
|       prototypes
+-------------------------------------------------------------------------*/
#ifdef __cplusplus
extern "C" {
#endif
                       
int XA_EXPORT xanalyzer_new(XA_Analyzer **analyzer);
int XA_EXPORT xanalyzer_delete(XA_Analyzer *analyzer);
int XA_EXPORT xanalyzer_process_file(XA_Analyzer *analyzer,
                                    const char *name,
                                    XA_AnalyzerCallbackFunction callback_function,
                                    XA_AnalyzerCallbackClient *callback_client,
                                    XA_AnalyzerInfo *info,
                                    unsigned long stop_mask,
                                    unsigned long watchdog,
                                    unsigned long max_frames);

#ifdef __cplusplus
}
#endif          

#endif /* _XANALYZE_H_ */


 
Sun bittern ©   (2004-04-05 08:55) [3]

Щас приведу чего у меня на паскале вышло


 
Sun bittern ©   (2004-04-05 09:12) [4]

XA_AnalyzerCallbackClient = ^XA_AnalyzerCallbackClient; {???}
Посмотрел все заголовочные файлы и ни где нет описание структуры XA_AnalyzerCallbackClient. Как это понимать?

unit xanalyze;

interface

const

//       error codes

XANALYZE_SUCCESS = (0);
XANALYZE_FAILURE = (-1);

XANALYZE_ERROR_INTERNAL = (-2);
XANALYSE_ERROR_OUT_OF_MEMORY = (-3);
XANALYZE_ERROR_NO_SUCH_FILE = (-4);
XANALYZE_ERROR_CANNOT_OPEN = (-5);
XANALYZE_ERROR_INVALID_FRAME = (-6);
XANALYZE_ERROR_EOS = (-7);
XANALYZE_ERROR_STOP_CONDITION = (-8);
XANALYZE_ERROR_WATCHDOG = (-9);

XANALYZE_INVALID_VALUE = (-1);
XANALYZE_ALL_FRAMES = (0);

XANALYZE_CALLBACK_CONTINUE = (0);
XANALYZE_CALLBACK_STOP = (-1);

XANALYZE_TRUE = 1;
XANALYZE_FALSE = 0;

//      constants
MPEG_ID_MPEG_1 = 1;
MPEG_ID_MPEG_2 = 0;
MPEG_ID_MPEG_2_5 = 2;

MPEG_MODE_STEREO = 0;
MPEG_MODE_JOINT_STEREO = 1;
MPEG_MODE_DUAL_CHANNEL = 2;
MPEG_MODE_SINGLE_CHANNEL = 3;

XANALYZE_REPORT_CHANGING_LEVEL = $001;
XANALYZE_REPORT_CHANGING_LAYER = $002;
XANALYZE_REPORT_CHANGING_BITRATE = $004;
XANALYZE_REPORT_CHANGING_FREQUENCY = $008;
XANALYZE_REPORT_CHANGING_MODE = $010;
XANALYZE_REPORT_CHANGING_CHANNELS = $020;
XANALYZE_REPORT_HAS_META_DATA = $040;
XANALYZE_REPORT_HAS_ID3V1_HEADER = $080;
XANALYZE_REPORT_HAS_ID3V2_HEADER = $100;

XANALYZE_REPORT_ANY_CHANGE_MASK = $3F;

//       types

type
 XA_AnalyzerMpegInfo = record
   level: integer;
   layer: integer;
   bitrate: integer;
   frequency: integer;
   mode: integer;
   channels: integer;
 end;

 XA_AnalyzerMpegFrameInfo = record
   index: Integer;
   info: XA_AnalyzerMpegInfo;
   offset: Integer;
   nb_samples: Integer;
 end;

 XA_AnalyzerTrackInfo = record
   title: pchar;
   artist: pchar;
   album: pchar;
   year: pchar;
   comment: pchar;
   genre: char;
 end;

 XA_AnalyzerInfo = record
   stream_type: XA_AnalyzerMpegInfo;
   track: XA_AnalyzerTrackInfo;
   frames: Integer;
   duration: Integer;
   flags: Integer;
 end;

 XA_AnalyzerCallbackClient = ^XA_AnalyzerCallbackClient; {???}
 XA_AnalyzerCallbackFunction = function(client: XA_AnalyzerCallbackClient;  frame: XA_AnalyzerMpegFrameInfo): integer;

 XA_Analyzer = ^XA_Analyzer; {???}

 function xanalyzer_new(analyzer: XA_Analyzer):Integer; stdcall;
 function xanalyzer_delete(analyzer: XA_Analyzer):Integer; stdcall;
 function xanalyzer_process_file(analyzer: XA_Analyzer;  name: pchar;  callback_function: XA_AnalyzerCallbackFunction;  callback_client: XA_AnalyzerCallbackClient;  info: XA_AnalyzerInfo;  stop_mask: Integer;  watchdog: Integer;  max_frames: Integer):Integer; stdcall;

implementation

 function xanalyzer_new(analyzer: XA_Analyzer):Integer; stdcall external "xanalyze.dll";
 function xanalyzer_delete(analyzer: XA_Analyzer):Integer; stdcall external "xanalyze.dll";
 function xanalyzer_process_file(analyzer: XA_Analyzer;  name: pchar;  callback_function: XA_AnalyzerCallbackFunction;  callback_client: XA_AnalyzerCallbackClient;  info: XA_AnalyzerInfo;  stop_mask: Integer;  watchdog: Integer;  max_frames: Integer):Integer; stdcall external "xanalyze.dll";

end.


 
wicked ©   (2004-04-05 10:54) [5]

http://www.astonshell.com -> c2pas32...
а вообще Це надо знать хотя бы в режиме чтения.... ;)


 
Sun bittern ©   (2004-04-05 11:02) [6]

wicked ©   (05.04.04 10:54) [5]

Не хрена она не поймет. Не надо тыкать ей :)

typedef struct XA_AnalyzerCallbackClient XA_AnalyzerCallbackClient;
typedef int (*XA_AnalyzerCallbackFunction)(XA_AnalyzerCallbackClient *client,
                                         XA_AnalyzerMpegFrameInfo *frame);

typedef struct XA_Analyzer XA_Analyzer;

Вот где у меня проблема. Как это в дельфе записать? XA_Analyzer структура не описанна (чего за фигня?).


 
VMcL ©   (2004-04-05 11:18) [7]

>>Sun bittern ©  (05.04.04 09:12) [4]

Согласен с [5] - про режим "чтения".

>typedef struct XA_Analyzer XA_Analyzer;
Что-то тут явно не так.

>int XA_EXPORT xanalyzer_new(XA_Analyzer **analyzer);
Что тут непонятного? звездочка - указатель, 2 звездочки - указатель на указатель.
type
 PXA_Analyzer = ^XA_Analyzer;
 TXA_Analyzer = {packed ?} record
   // ...
 end;

function xanalyzer_new(var analyzer: PXA_Analyzer); stdcall;


 
VMcL ©   (2004-04-05 11:19) [8]

>>VMcL ©  (05.04.04 11:18) [7]

Да, забыл. stdcall, если defined(WIN32) || defined(_WIN32)


 
Sun bittern ©   (2004-04-05 11:34) [9]

VMcL ©

Вот это меня и смутило. Чего за структура без описалова, как такового?

typedef struct XA_Analyzer XA_Analyzer;

TXA_Analyzer = {packed ?} record


 
Suntechnic ©   (2004-04-05 16:34) [10]

Sun bittern ©   (05.04.04 11:34) [9]
Чего за структура без описалова, как такового?


Да это не описание структуры. Это объявление вперёд, для того чтобы тип можно было использовать как здесь как параметр ф-ции. Само описание находится где-то в другом месте.


 
Sun bittern ©   (2004-04-07 06:29) [11]

Suntechnic ©   (05.04.04 16:34) [10]
>> Само описание находится где-то в другом месте.

Sun bittern ©   (05.04.04 09:12) [4]

>> Посмотрел все заголовочные файлы и ни где нет описание структуры

А не может эта хрень
typedef struct XA_Analyzer XA_Analyzer;
быть просто Pointer? Как указатель на некий объект?


 
Suntechnic ©   (2004-04-07 07:40) [12]

>Sun bittern ©
А не может эта хрень
typedef struct XA_Analyzer XA_Analyzer;
быть просто Pointer? Как указатель на некий объект?


Нет не может. У тебя только заголовоные файлы или исходники тоже есть? Если только заголовочные, то тогда ты можешь и не увидеть описание типа. В С++ это делается проще, но в С это может выглядеть примерно так.

// file1.h
typedef struct XA_Analyzer XA_Analyzer;
void fun(XA_Analyzer analyzer);
// end file1.h

// file1.c
struct XA_Analyzer
{
int a;
};

void fun(XA_Analyzer analyzer)
{
  analyzer.a = 10;
}
// end file1.c


В итоге: всё что ты видишь это некий прототип, некой ф-ции которая принимает параметром тип XA_Analyzer, но само описание типа скрыто от тебя.


 
Suntechnic ©   (2004-04-07 07:50) [13]

>Sun bittern ©
Кстати исходя из логики, тебе описание XA_Analyzer и не надо, потому что у тебя есть ф-ции которые создают и удаляют этот объект. Конечно это до тех пор, пока ты сам не захочешь чего-нибудь с этим аналайзером делать.


 
Suntechnic ©   (2004-04-07 07:55) [14]

>Sun bittern ©
А не может эта хрень
typedef struct XA_Analyzer XA_Analyzer;
быть просто Pointer? Как указатель на некий объект?


Ещё разок выступлю :)...  
Если ты имел ввиду, что объявить это в Delphi как некий поинтер, на некий тип, то именно так и надо делать. Просто в первом посте я подумал, что ты ведешь речь о сишном коде.


 
Sun bittern ©   (2004-04-07 09:08) [15]

Suntechnic ©   (07.04.04 07:40) [12]
Suntechnic ©   (07.04.04 07:55) [14]
А вотоно как в С бывает.
Ладно дома опробую, буду надеется заработает.
У меня только заголовочные файлы к DLL, исходников нет.
Спасибо всем за уделенное время!
Буду эксперементировать.



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

Форум: "Потрепаться";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.038 c
3-1080914276
Borealis
2004-04-02 17:57
2004.05.02
Отследить реструктуризацию


14-1081857387
Igorek
2004-04-13 15:56
2004.05.02
Записать изображение активного курсора в файл


1-1081879867
Mishenka
2004-04-13 22:11
2004.05.02
Кавычки в FileNameEdit из RxLib...


1-1081772016
ss300
2004-04-12 16:13
2004.05.02
Обработка TEdit


4-1074852801
Сергей_
2004-01-23 13:13
2004.05.02
Память





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