Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

А как это на 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.032 c
3-1081239767
Vlad1
2004-04-06 12:22
2004.05.02
Зфпуск ibserver.exe в WinXP


3-1080918463
}|{yk
2004-04-02 19:07
2004.05.02
ОК, а как получит всех детей любого поддерева не имеющих потомков


6-1078420166
Delpher_Gray
2004-03-04 20:09
2004.05.02
Склеивание пакетов, избежание при этом ошибок


11-1065968229
BelchonokH
2003-10-12 18:17
2004.05.02
Mouse.Button=mbNone


11-1065301772
Sagrer
2003-10-05 01:09
2004.05.02
Существует ли аналог CoolBar под KOL?