Форум: "Потрепаться";
Текущий архив: 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