Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wer Hilft bei einer kleinen übersetzung Delphi > C ? (https://www.delphipraxis.net/96971-wer-hilft-bei-einer-kleinen-uebersetzung-delphi-c.html)

EWeiss 2. Aug 2007 11:57


Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Mein Interface Delphi

Delphi-Quellcode:
{' UNIT BassVis.pas
'--------------------------- BassVis API Module -----------------------------
' BassVis ADD-ON for Bass Audio Library
' Copyright © 2006-2007 BrewIdeas@Emil Weiss, All Rights Reserved
'
' Author(s) of this Unit: Emil Weiss / Uwe Rupprecht
'
' Code was written in and formatted for 10pt Courier New
'----------------------------------------------------------------------------}

unit BassVis;

interface

uses
  Windows;

type
  HVIS = DWORD;
  QWORD = Int64;

const

  dllfile = 'bass_vis.dll';                 //filename of the DLL
 
  // BASS_SONIQUEVIS_CreateVis flags
  BASS_VIS_NOINIT = 1;

  // BASS_SONIQUEVIS_SetConfig flags
  BASS_SONIQUEVIS_CONFIG_FFTAMP        = 1;
  BASS_SONIQUEVIS_CONFIG_FFT_SKIPCOUNT = 2; // Skip count range is from 0 to 3 (because of limited FFT request size)
  BASS_SONIQUEVIS_CONFIG_WAVE_SKIPCOUNT = 3; // Skip count range is from 0 to (...) try it out, whenever Bass crashes or does not return enough sample data
  BASS_SONIQUEVIS_CONFIG_SLOWFADE      = 4; // Dim light colors to less than half, then slowly fade them out

  // BASS_WINAMP_SetConfig flags
  BASS_WINAMPVIS_CONFIG_FFTAMP = 1;

  // BASS_VIS_FindPlugin flags
  BASS_VIS_FIND_SONIQUE  = 1;
  BASS_VIS_FIND_WINAMP   = 2;
  BASS_VIS_FIND_RECURSIVE = 4;

  //Plugin arten
  BASSVISKIND_NONE   = 0; // keins aktiv
  BASSVISKIND_WINAMP = 1; // Winamp
  BASSVISKIND_SONIQUE = 2; // Sonique

type
  TBASSVIS_KIND_T = integer;

  PBASSVIS_PARAM = ^TBASSVIS_PARAM;
  TBASSVIS_PARAM = record
    VisHandle       : HVIS;           // VisHandle
    VisWinHandle    : DWORD;          // Vis Window Handle        W2
    VisGenWinHandle : DWORD;          // General Vis Window Handle W5
    Kind            : TBASSVIS_KIND_T; // Aktive Plugin Art
  end;

  //Definition der Records für die variablen Parameter bei Create bzw. Execute
  PBASSVIS_EXEC = ^TBASSVIS_EXEC;
  TBASSVIS_EXEC = record
    AMP_SON_Pluginfile : PChar;   // Dateiname des Plugins für Sonique und Winamp
    AMP_UseOwnW1       : DWORD;   // Flag für Winamp (ownHDC)
    AMP_UseOwnW2       : DWORD;   // Flag für Winamp (ownHDCW2)
    AMP_Moduleindex   : DWORD;   // Modul-index für Winamp
    SON_PaintHandle   : THandle; // Painthandle für Sonique  
    SON_ConfigFile    : PChar;   // Dateiname der Konfiguration für Sonique
    SON_Flags         : DWORD;   // Flags für Sonique
    Width, Height     : integer; // Fensterhöhe und Breite
    Left, Top         : integer; // Left und Top;
  end;

  PBASSVIS_INFO = ^TBASSVIS_INFO;
  TBASSVIS_INFO = record
    SongTitle  : PChar;  // Titel mit vorstehener TitelNr ('1. ')
    Songfile   : PChar;  // SongTitel incl. Pfad
    pos        : DWORD;  // 1000 * Aktuelle Position im Stream
    len        : DWORD;  // Stream länge
    PlaylistPos : DWORD;  // Playlist Position
    Playlistlen : DWORD;  // Playlist einträge
    SampleRate : integer; // SämpleRate
    BitRate    : integer; // BitRate
    Duration   : DWORD;  // abgelaufen Zeit
    Channels   : integer; // Kanäle default 2 (stereo)

  end;

  TPlayState   = (psError = 99, psStop = 0, psPlay = 1,
                   psIsPlaying = 2, psPause= 3,
                   psGetPlaylistPos = 4, psSetPlaylistPos = 5);


TBASSVIS_STATECALLBACK = procedure(NewState:TPlayState); stdcall;

//Core functions for initalizing BASSVIS and Find Plugins of any kind
function BASSVIS_Init(Kind: TBASSVIS_KIND_T;
    AppHandle: HWND;
    WinHandle: HWND): BOOL; stdcall; external dllfile;


function BASSVIS_FindPlugins(Kind: TBASSVIS_KIND_T;
    PluginPath: PChar;
    Searchflags: DWORD;
    delimiter : char = ','
): PChar; stdcall; external dllfile;


function BASSVIS_GetPluginHandle(Kind: TBASSVIS_KIND_T;
    Pluginfile: PChar
): PBASSVIS_PARAM; stdcall; external dllfile;


procedure BASSVIS_ExecutePlugin(Param: PBASSVIS_EXEC;
    var Base: TBASSVIS_PARAM
); stdcall; external dllfile;


function BASSVIS_RenderChannel(Param: PBASSVIS_PARAM;
    channel: DWORD
): BOOL; stdcall; external dllfile;


function BASSVIS_StartRecord(Param: PBASSVIS_PARAM;
    SampleRate: integer = 44100;
    Channels: integer = 2
): BOOL; stdcall; external dllfile;


function BASSVIS_Config(Param: PBASSVIS_PARAM;
    Entry: integer = -1
): BOOL; stdcall; external dllfile;


function BASSVIS_SetInfo(Param: PBASSVIS_PARAM;
    Infos: PBASSVIS_INFO
): BOOL; stdcall; external dllfile;


function BASSVIS_Resize(Param: PBASSVIS_PARAM;
    Left,Top,Width,
    Height: DWORD
): BOOL; stdcall; external dllfile;


function BASSVIS_SetFullscreen(Param: PBASSVIS_PARAM;
    SourceHandle, DestHandle: HWND;
    SourceLeft, SourceTop,
    SourceWidth, SourceHeight: DWORD;
    FullScreenFlag: Boolean;
    FullScreeWidth, FullScreenHeight: DWORD
): BOOL; stdcall; external dllfile;


function BASSVIS_GetModulePresetCount(Param: PBASSVIS_PARAM;
    PluginName: PChar
): integer; stdcall; external dllfile;


function BASSVIS_GetModulePresetName(Param: PBASSVIS_PARAM;
    index: integer;
    PluginName: PChar = nil
): PChar; stdcall; external dllfile;


function BASSVIS_GetModulePresetNameList(param: PBASSVIS_PARAM;
   Pluginname:Pchar = NIL
):Pchar;stdcall; external dllfile;


function BASSVIS_GetOption(Param: PBASSVIS_PARAM;
    option: integer
): integer; stdcall; external dllfile;


function BASSVIS_SetOption(Param: PBASSVIS_PARAM;
    option: integer;
    Value: integer
): BOOL; stdcall; external dllfile;


function BASSVIS_SetPlayState(Param: PBASSVIS_PARAM;
    State: TPlayState;
    Value: integer = -1
): integer; stdcall; external dllfile;


procedure BASSVIS_SetVisPort(Parram: PBASSVIS_PARAM;
    WindowHandle: HWND;
    ContainerHandle: HWND;
    x, y, Width, Height: integer
); stdcall;external dllfile;


function BASSVIS_SONIQUEVIS_Clicked(
  handle: HVIS;
  x, y: DWORD
): boolean; stdcall;external dllfile;

function BASSVIS_GetPluginName(Param: PBASSVIS_PARAM): PChar; stdcall; external dllfile;
function BASSVIS_IsFree(Param: PBASSVIS_PARAM): BOOL; stdcall; external dllfile;
function BASSVIS_Free(Param: PBASSVIS_PARAM): BOOL; stdcall; external dllfile;
function BASSVIS_GetVersion: pchar; stdcall; external dllfile;
procedure BASSVIS_Quit(Param: PBASSVIS_PARAM);stdcall; external dllfile;

//Spezial für Winamp
procedure BASSVIS_WINAMP_SetStateCallback(callback:TBASSVIS_STATECALLBACK);stdcall;external dllfile;
procedure BASSVIS_WINAMP_RemoveCallback;stdcall;external dllfile;



implementation

end.
Das Interface C++ Header hab schon angefangen denke aber das einiges nicht stimmt.

Code:
#ifndef BASSVIS_H
#define BASSVIS_H

#include <wtypes.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef BASSVISDEF
#define BASSVISDEF(f) WINAPI f
#endif

typedef DWORD HVIS;
typedef unsigned __int64 QWORD;


// BASS_SONIQUEVIS_CreateVis flags
#define BASS_VIS_NOINIT            1

// BASS_SONIQUEVIS_SetConfig flags
#define BASS_SONIQUEVIS_CONFIG_FFTAMP         1
#define BASS_SONIQUEVIS_CONFIG_FFT_SKIPCOUNT   2 // Skip count range is from 0 to 3 (because of limited FFT request size)
#define BASS_SONIQUEVIS_CONFIG_WAVE_SKIPCOUNT  3 // Skip count range is from 0 to (...) try it out, whenever Bass crashes or does not return enough sample data
#define BASS_SONIQUEVIS_CONFIG_SLOWFADE           4 // Dim light colors to less than half, then slowly fade them out

// BASS_WINAMP_SetConfig flags
#define BASS_WINAMPVIS_CONFIG_FFTAMP   1

// BASS_VIS_FindPlugin flags
#define BASS_VIS_FIND_SONIQUE         1
#define BASS_VIS_FIND_WINAMP         2
#define BASS_VIS_FIND_RECURSIVE         4

//Plugin kind
#define BASSVISKIND_NONE    0 // no kind
#define BASSVISKIND_WINAMP  1 // Winamp
#define BASSVISKIND_SONIQUE 2 // Sonique


typedef int BASSVIS_KIND_T;

typedef struct {
    HVIS VisHandle;         // VisHandle
    DWORD VisWinHandle;      // Vis Window Handle        W2
    DWORD VisGenWinHandle;   // General Vis Window Handle W5
    BASSVIS_KIND_T Kind;     // Plugin kind   
} BASSVIS_PARAM;

typedef struct {
    char* AMP_SON_Pluginfile; // path to Plugin kind
    DWORD AMP_UseOwnW1;      // flags for Winamp (ownHDC)
    DWORD AMP_UseOwnW2;      // flags for Winamp (ownHDCW2)
    DWORD AMP_Moduleindex;   // Modul-index for Winamp
    DWORD SON_PaintHandle    // Painthandle for Sonique
    char* SON_ConfigFile;    // path to configfile Sonique
    DWORD SON_Flags;         // flags for Sonique
    int  Width;             // SrcWindow width
    int  Height;            // SrcWindow height
    int  Left;              // SrcWindow left
    int  Top;               // SrcWindow top
} BASSVIS_EXEC;

typedef struct { 
    char* SongTitle;         // songtitel
    char* Songfile;          // songTitle with path
    DWORD pos;               // stream position
    DWORD len;               // stream length
    DWORD PlaylistPos;       // playlist position
    DWORD Playlistlen;       // playlist entry
    int SampleRate;          // samplerate
    int BitRate;             // bitrate
    DWORD Duration;          // duration
    int Channels;            // channel default 2 (stereo)
} BASSVIS_INFO;

enum PlayState {
   psError = 99,         
   psStop = 0,             
   psPlay = 1,      
   psIsPlaying = 2,         
   psPause = 3,      
   psGetPlaylistPos = 4,         
   psSetPlaylistPos = 5,         
};


BASSVIS_STATECALLBACK = void(PlayState int NewState); stdcall;

BOOL BASSVISDEF(BASSVIS_Init)(BASSVIS_KIND_T Kind, HWND AppHandle, HWND WinHandle, HWND PaintHandle);
BOOL BASSVISDEF(BASSVIS_RenderChannel)(BASSVIS_PARAM Param, DWORD channel);
BOOL BASSVISDEF(BASSVIS_StartRecord)(BASSVIS_PARAM Param, int SampleRate = 44100, int Channels = 2);
BOOL BASSVISDEF(BASSVIS_Config)(BASSVIS_PARAM Param, int Entry = -1);
BOOL BASSVISDEF(BASSVIS_SetInfo)(BASSVIS_PARAM Param, BASSVIS_INFO Infos);
BOOL BASSVISDEF(BASSVIS_Resize)(BASSVIS_PARAM Param, int Left, int Top, int Width, int Height);
BOOL BASSVISDEF(BASSVIS_SetFullscreen)(BASSVIS_PARAM Param, HWND SourceHandle, HWND DestHandle, int SourceLeft, int SourceTop, int SourceWidth, int SourceHeight, BOOL FullScreenFlag, int FullScreeWidth, int FullScreenHeight);
BOOL BASSVISDEF(BASSVIS_SetModulePreset)(BASSVIS_PARAM Param, int index);
BOOL BASSVISDEF(BASSVIS_SetOption)(BASSVIS_PARAM Param, int option, int value);
BOOL BASSVISDEF(BASSVIS_IsFree)(BASSVIS_PARAM Param);
BOOL BASSVISDEF(BASSVIS_Free)(BASSVIS_PARAM Param);

char* BASSVISDEF(BASSVIS_FindPlugins)(BASSVIS_KIND_T Kind, char *PluginPath, DWORD Searchflags);
char* BASSVISDEF(BASSVIS_GetModulePresetName)(BASSVIS_PARAM Param, int index, char* PluginName = null);
char* BASSVISDEF(BASSVIS_GetModulePresetNameList)(BASSVIS_PARAM Param, char* PluginName = null);

char* BASSVISDEF(BASSVIS_GetPluginName)(BASSVIS_PARAM Param);
char* BASSVISDEF(BASSVIS_GetVersion);

BASSVIS_PARAM BASSVISDEF(BASSVIS_GetPluginHandle)(BASSVIS_KIND_T Kind, char *Pluginfile);

void BASSVISDEF(BASSVIS_ExecutePlugin)(BASSVIS_EXEC Param, BASSVIS_PARAM out Base);
void BASSVISDEF(BASSVIS_Quit)(BASSVIS_PARAM Param);
void BASSVISDEF(BASSVIS_SetGenParent)(HWND WindowHandle, HWND ContainerHandle, int Left, int Top, int Width, int Height);


int BASSVISDEF(BASSVIS_GetModulePresetCount)(BASSVIS_PARAM Param, char* PluginName);
int BASSVISDEF(BASSVIS_GetOption)(BASSVIS_PARAM Param, int option);
int BASSVISDEF(BASSVIS_SetPlayState)(BASSVIS_PARAM Param, PlayState State, int value = -1);

//Spezial for Winamp
void BASSVISDEF(BASSVIS_WINAMP_SetStateCallback)(BASSVIS_STATECALLBACK callback);
void BASSVISDEF(BASSVIS_WINAMP_RemoveCallback);
BOOL BASSVISDEF(BASSVIS_SONIQUEVIS_Clicked)(HVIS handle, DWORD x, DWORD y);

#ifdef __cplusplus
}
#endif

#endif
Würd mich freuen wenn mir jemand helfen könnte
Sind nur ein paar Fehler denke ich mal..

gruss Emil

Jürgen Thomas 2. Aug 2007 12:37

Re: Übersetzung "von Delphi nach C++"
 
[OT]
Hallo,

bitte schreib doch in den Titel, dass es um eine Übersetzung "von Delphi nach C++" geht, damit jemand, der davon keine Ahnung (wie ich bei C++), sich die Aufgabe nicht erst genau anschauen muss.

Gruß Jürgen
[/OT]

EWeiss 2. Aug 2007 12:43

Re: Übersetzung "von Delphi nach C++"
 
Zitat:

Zitat von Jürgen Thomas
[OT]
Hallo,

bitte schreib doch in den Titel, dass es um eine Übersetzung "von Delphi nach C++" geht, damit jemand, der davon keine Ahnung (wie ich bei C++), sich die Aufgabe nicht erst genau anschauen muss.

Gruß Jürgen
[/OT]

Oben steht Delphi Interface und drunter c++ Header
Sieht man sich beide zeilen an muss man nicht genau hinschauen wenn man C++ nicht beherscht ;)

gruss Emil

Der_Unwissende 2. Aug 2007 12:48

Re: Wer Hilft bei einer kleinen übersetzung ?
 
Hi,
ich glaube es geht eher um den Titel des Threads, ich bin ehrlich gesagt auch nicht sicher gewesen, was Du hier meinst. Immerhin könnte es eine Übersetzung von C++ -> Delphi, aber eben auch nach Java oder von Deutsch nach Englisch sein. Von daher würde ich dem Jürgen Thomas zustimmen, dass ein besserer Titel echt nett gegenüber den anderen wäre.

Gruß Der Unwissende

PS.: Es reichen hier C Kenntnisse aus, das Header File verwendet (auf den ersten Blick) keine speziellen C++ Eigenschaften (Klassen, Namensräume, Templates, ...).

EWeiss 2. Aug 2007 13:03

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Na bitte ;)
Habe es geändert ..

Ob die änderung des Titels zum erfolg führt mag dahin gestellt sein.

gruss Emil

Jürgen Thomas 2. Aug 2007 14:44

Re: Wer Hilft bei einer kleinen übersetzung ?
 
Zitat:

Zitat von Der_Unwissende
Immerhin könnte es eine Übersetzung von C++ -> Delphi, aber eben auch nach Java oder von Deutsch nach Englisch sein. Von daher würde ich dem Jürgen Thomas zustimmen, dass ein besserer Titel echt nett gegenüber den anderen wäre.

Nur so habe ich es gemeint.

Danke, Emil! Jürgen

Apollonius 2. Aug 2007 14:45

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
1. Zur Sicherheit sollte man in Delphi "Packed record" statt einem einfachen record nehmen, sonst kann es zu Inkompatibilität kommen.

2. Funktionszeiger werden in C++ anders definiert:
Delphi-Quellcode:
TBASSVIS_STATECALLBACK = procedure(NewState:TPlayState); stdcall;
wird zu
Code:
typedef void (_stdcall *BASSVIS_STATECALLBACK) (PlayState);
Ich habe noch nicht alles durchgeschaut, es kann also noch weitere Fehler geben.
Gruß
Apollonius

Der_Unwissende 2. Aug 2007 14:52

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Hi,
es gibt ein paar Stellen, die mich wundern, so übergibst Du häufiger mal Zeiger auf die Strukturen, der C-Code macht das (soweit ich es sehe) aber an keiner Stelle sondern übergibt immer eine Kopie, z.B.:
Code:
BOOL BASSVISDEF(BASSVIS_StartRecord)(BASSVIS_PARAM Param, int SampleRate = 44100, int Channels = 2);
vs.

Delphi-Quellcode:
function BASSVIS_StartRecord(Param: PBASSVIS_PARAM;
    SampleRate: integer = 44100;
    Channels: integer = 2 
): BOOL; stdcall; external dllfile;
Wo kommt hier das PBASSVIS_PARAM her? Das taucht analog bei den anderen Routinen auf, deren Typ mit P beginnt.

EWeiss 2. Aug 2007 15:14

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Zitat:

Zitat von Der_Unwissende
Hi,
es gibt ein paar Stellen, die mich wundern, so übergibst Du häufiger mal Zeiger auf die Strukturen, der C-Code macht das (soweit ich es sehe) aber an keiner Stelle sondern übergibt immer eine Kopie, z.B.:
Code:
BOOL BASSVISDEF(BASSVIS_StartRecord)(BASSVIS_PARAM Param, int SampleRate = 44100, int Channels = 2);
vs.

Delphi-Quellcode:
function BASSVIS_StartRecord(Param: PBASSVIS_PARAM;
    SampleRate: integer = 44100;
    Channels: integer = 2 
): BOOL; stdcall; external dllfile;
Wo kommt hier das PBASSVIS_PARAM her? Das taucht analog bei den anderen Routinen auf, deren Typ mit P beginnt.

ja PBASSVIS_PARAM ist der zeiger auf den Record TBASSVIS_PARAM
in C habe ich das gleiche übersetzt lediglich das P vor der Struct entfernt

Deshalb ja auch der Thread da ich denke das hier einige übersetzungs fehler vorliegen.
Auch weiss ich nicht ob man optionale Parameter überhaupt in c so übergeben kann .. siehe 'int SampleRate = 44100'

genauso weiss ich nicht wie ich diese Zeile übersetzen soll.
Delphi-Quellcode:
BASSVIS_STATECALLBACK = void(PlayState int NewState); stdcall;
stdcall habe ich belassen damit dem Übersetzer direkt auffällt das ich hier ein übersetzungsproblem habe.

gruss Emil

EDIT:
Müßte das dann so aussehen ?
Code:
BOOL BASSVISDEF(BASSVIS_StartRecord)(*BASSVIS_PARAM Param, int SampleRate = 44100, int Channels = 2);

EWeiss 2. Aug 2007 15:17

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Zitat:

Zitat von Apollonius
1. Zur Sicherheit sollte man in Delphi "Packed record" statt einem einfachen record nehmen, sonst kann es zu Inkompatibilität kommen.

2. Funktionszeiger werden in C++ anders definiert:
Delphi-Quellcode:
TBASSVIS_STATECALLBACK = procedure(NewState:TPlayState); stdcall;
wird zu
Code:
typedef void (_stdcall *BASSVIS_STATECALLBACK) (PlayState);
Ich habe noch nicht alles durchgeschaut, es kann also noch weitere Fehler geben.
Gruß
Apollonius

ahhh danke das hilft mir schon mal weiter war eines meiner größten Probleme deshalb habe ich auch das stdCall gelassen.
Denke das es aber in der Funktion selbst nicht übergeben werden muss oder gibt es das auch in C

gruss Emil

Der_Unwissende 2. Aug 2007 15:34

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Zitat:

Zitat von EWeiss
Müßte das dann so aussehen ?
Code:
BOOL BASSVISDEF(BASSVIS_StartRecord)(*BASSVIS_PARAM Param, int SampleRate = 44100, int Channels = 2);

Fast, richtiger ist:
Code:
BOOL BASSVISDEF(BASSVIS_StartRecord)(BASSVIS_PARAM* Param, int SampleRate = 44100, int Channels = 2);
Also der Stern gehört auf die andere Seite bzw. kann auch direkt vor den Namen der Variablen geschrieben werden

Code:
int a, //kein Zeiger
    *b; // Zeiger
int* c; // ebenfalls Zeiger
Nur bei Funktions- bzw. Methodenzeigern wird der Stern nach links gesetzt (das unterscheidet die dann auch von der "normalen" Referenz auf eine Variable). Lässt Du den Stern weg, wird eine komplette Kopie und kein Zeiger übergeben, das würde also ein paar unerwünschte Effekte mit sich bringen.

EWeiss 2. Aug 2007 15:38

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Zitat:

Zitat von Der_Unwissende
Zitat:

Zitat von EWeiss
Müßte das dann so aussehen ?
Code:
BOOL BASSVISDEF(BASSVIS_StartRecord)(*BASSVIS_PARAM Param, int SampleRate = 44100, int Channels = 2);

Fast, richtiger ist:
Code:
BOOL BASSVISDEF(BASSVIS_StartRecord)(BASSVIS_PARAM* Param, int SampleRate = 44100, int Channels = 2);
Also der Stern gehört auf die andere Seite bzw. kann auch direkt vor den Namen der Variablen geschrieben werden

Code:
int a, //kein Zeiger
    *b; // Zeiger
int* c; // ebenfalls Zeiger
Nur bei Funktions- bzw. Methodenzeigern wird der Stern nach links gesetzt (das unterscheidet die dann auch von der "normalen" Referenz auf eine Variable). Lässt Du den Stern weg, wird eine komplette Kopie und kein Zeiger übergeben, das würde also ein paar unerwünschte Effekte mit sich bringen.

Fein ;)
Dann werde ich das schon mal alles ändern!
Bei den stellen wo der zeiger auf die Struct zeigt.

Die Optionalen werte sind so in Ordnung ?

gruss Emil

Apollonius 2. Aug 2007 15:46

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Zitat:

ahhh danke das hilft mir schon mal weiter war eines meiner größten Probleme deshalb habe ich auch das stdCall gelassen.
Denke das es aber in der Funktion selbst nicht übergeben werden muss oder gibt es das auch in C
Standardaufrufkonvention ist in C++ cdecl (woher wohl der Name kommt? :???: ). _stdcall ist daher notwendig.

EWeiss 2. Aug 2007 15:47

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Nochmal das geänderte Headerfile

Code:
#ifndef BASSVIS_H
#define BASSVIS_H

#include <wtypes.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef BASSVISDEF
#define BASSVISDEF(f) WINAPI f
#endif

typedef DWORD HVIS;
typedef unsigned __int64 QWORD;


// BASS_SONIQUEVIS_CreateVis flags
#define BASS_VIS_NOINIT            1

// BASS_SONIQUEVIS_SetConfig flags
#define BASS_SONIQUEVIS_CONFIG_FFTAMP         1
#define BASS_SONIQUEVIS_CONFIG_FFT_SKIPCOUNT   2 // Skip count range is from 0 to 3 (because of limited FFT request size)
#define BASS_SONIQUEVIS_CONFIG_WAVE_SKIPCOUNT  3 // Skip count range is from 0 to (...) try it out, whenever Bass crashes or does not return enough sample data
#define BASS_SONIQUEVIS_CONFIG_SLOWFADE           4 // Dim light colors to less than half, then slowly fade them out

// BASS_WINAMP_SetConfig flags
#define BASS_WINAMPVIS_CONFIG_FFTAMP   1

// BASS_VIS_FindPlugin flags
#define BASS_VIS_FIND_SONIQUE         1
#define BASS_VIS_FIND_WINAMP         2
#define BASS_VIS_FIND_RECURSIVE         4

//Plugin kind
#define BASSVISKIND_NONE    0 // no kind
#define BASSVISKIND_WINAMP  1 // Winamp
#define BASSVISKIND_SONIQUE 2 // Sonique


typedef int BASSVIS_KIND_T;

typedef struct {
    HVIS VisHandle;         // VisHandle
    DWORD VisWinHandle;      // Vis Window Handle        W2
    DWORD VisGenWinHandle;   // General Vis Window Handle W5
    BASSVIS_KIND_T Kind;     // Plugin kind   
} BASSVIS_PARAM;

typedef struct {
    char* AMP_SON_Pluginfile; // path to Plugin kind
    DWORD AMP_UseOwnW1;      // flags for Winamp (ownHDC)
    DWORD AMP_UseOwnW2;      // flags for Winamp (ownHDCW2)
    DWORD AMP_Moduleindex;   // Modul-index for Winamp
    DWORD SON_PaintHandle    // Painthandle for Sonique
    char* SON_ConfigFile;    // path to configfile Sonique
    DWORD SON_Flags;         // flags for Sonique
    int  Width;             // SrcWindow width
    int  Height;            // SrcWindow height
    int  Left;              // SrcWindow left
    int  Top;               // SrcWindow top
} BASSVIS_EXEC;

typedef struct { 
    char* SongTitle;         // songtitel
    char* Songfile;          // songTitle with path
    DWORD pos;               // stream position
    DWORD len;               // stream length
    DWORD PlaylistPos;       // playlist position
    DWORD Playlistlen;       // playlist entry
    int SampleRate;          // samplerate
    int BitRate;             // bitrate
    DWORD Duration;          // duration
    int Channels;            // channel default 2 (stereo)
} BASSVIS_INFO;

enum PlayState {
   psError = 99,         
   psStop = 0,             
   psPlay = 1,      
   psIsPlaying = 2,         
   psPause = 3,      
   psGetPlaylistPos = 4,         
   psSetPlaylistPos = 5,         
};


typedef void (_stdcall *BASSVIS_STATECALLBACK) (PlayState);

BOOL BASSVISDEF(BASSVIS_Init)(BASSVIS_KIND_T Kind, HWND AppHandle, HWND WinHandle, HWND PaintHandle);
BOOL BASSVISDEF(BASSVIS_RenderChannel)(BASSVIS_PARAM* Param, DWORD channel);
BOOL BASSVISDEF(BASSVIS_StartRecord)(BASSVIS_PARAM* Param, int SampleRate = 44100, int Channels = 2);
BOOL BASSVISDEF(BASSVIS_Config)(BASSVIS_PARAM* Param, int Entry = -1);
BOOL BASSVISDEF(BASSVIS_SetInfo)(BASSVIS_PARAM* Param, BASSVIS_INFO Infos);
BOOL BASSVISDEF(BASSVIS_Resize)(BASSVIS_PARAM* Param, int Left, int Top, int Width, int Height);
BOOL BASSVISDEF(BASSVIS_SetFullscreen)(BASSVIS_PARAM* Param, HWND SourceHandle, HWND DestHandle, int SourceLeft, int SourceTop, int SourceWidth, int SourceHeight, BOOL FullScreenFlag, int FullScreeWidth, int FullScreenHeight);
BOOL BASSVISDEF(BASSVIS_SetModulePreset)(BASSVIS_PARAM* Param, int index);
BOOL BASSVISDEF(BASSVIS_SetOption)(BASSVIS_PARAM* Param, int option, int value);
BOOL BASSVISDEF(BASSVIS_IsFree)(BASSVIS_PARAM* Param);
BOOL BASSVISDEF(BASSVIS_Free)(BASSVIS_PARAM* Param);

char* BASSVISDEF(BASSVIS_FindPlugins)(BASSVIS_KIND_T Kind, char *PluginPath, DWORD Searchflags);
char* BASSVISDEF(BASSVIS_GetModulePresetName)(BASSVIS_PARAM* Param, int index, char* PluginName = null);
char* BASSVISDEF(BASSVIS_GetModulePresetNameList)(BASSVIS_PARAM* Param, char* PluginName = null);

char* BASSVISDEF(BASSVIS_GetPluginName)(BASSVIS_PARAM* Param);
char* BASSVISDEF(BASSVIS_GetVersion);

BASSVIS_PARAM BASSVISDEF(BASSVIS_GetPluginHandle)(BASSVIS_KIND_T Kind, char *Pluginfile);

void BASSVISDEF(BASSVIS_ExecutePlugin)(BASSVIS_EXEC* Param, BASSVIS_PARAM out Base);
void BASSVISDEF(BASSVIS_Quit)(BASSVIS_PARAM* Param);
void BASSVISDEF(BASSVIS_SetGenParent)(HWND WindowHandle, HWND ContainerHandle, int Left, int Top, int Width, int Height);


int BASSVISDEF(BASSVIS_GetModulePresetCount)(BASSVIS_PARAM* Param, char* PluginName);
int BASSVISDEF(BASSVIS_GetOption)(BASSVIS_PARAM* Param, int option);
int BASSVISDEF(BASSVIS_SetPlayState)(BASSVIS_PARAM* Param, PlayState State, int value = -1);

//Spezial for Winamp
void BASSVISDEF(BASSVIS_WINAMP_SetStateCallback)(BASSVIS_STATECALLBACK callback);
void BASSVISDEF(BASSVIS_WINAMP_RemoveCallback);
BOOL BASSVISDEF(BASSVIS_SONIQUEVIS_Clicked)(HVIS handle, DWORD x, DWORD y);

#ifdef __cplusplus
}
#endif

#endif
Meine aktuellen probleme jetzt noch..
Code:
void BASSVISDEF(BASSVIS_WINAMP_SetStateCallback)(BASSVIS_STATECALLBACK callback);
auch der pointer bei BASSVIS_STATECALLBACK rechts oder links ?

Code:
void BASSVISDEF(BASSVIS_ExecutePlugin)(BASSVIS_EXEC* Param, BASSVIS_PARAM out Base);
Delphi-Quellcode:
procedure BASSVIS_ExecutePlugin(Param: PBASSVIS_EXEC;
    var Base: TBASSVIS_PARAM
); stdcall; external dllfile;
bin mir nicht sicher was ich von Delphi 'var' in C 'out' übergeben soll.
Denke das hier auch ein Problem vorliegt.

gruss Emil

EWeiss 2. Aug 2007 15:49

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Zitat:

Zitat von Apollonius
Zitat:

ahhh danke das hilft mir schon mal weiter war eines meiner größten Probleme deshalb habe ich auch das stdCall gelassen.
Denke das es aber in der Funktion selbst nicht übergeben werden muss oder gibt es das auch in C
Standardaufrufkonvention ist in C++ cdecl (woher wohl der Name kommt? :???: ). _stdcall ist daher notwendig.

Hmm cdecl ??
dann doch eher anstatt _stdcall , >> _cdecl oder ?

gruss Emil

Apollonius 2. Aug 2007 15:53

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Entweder in Delphi und C++ stdcall oder in beidem cdecl, wobei das Schlüsselwort in C++ weggelassen werden kann. Ich glaube, wir reden gerade aneinander vorbei.

EWeiss 2. Aug 2007 16:02

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Zitat:

Zitat von Apollonius
Entweder in Delphi und C++ stdcall oder in beidem cdecl, wobei das Schlüsselwort in C++ weggelassen werden kann. Ich glaube, wir reden gerade aneinander vorbei.

Danke dann ist _stdCall richtig ;) da auch in Delphi so übergeben

gruss Emil

Der_Unwissende 2. Aug 2007 16:07

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Zitat:

Zitat von Apollonius
wobei das Schlüsselwort in C++ weggelassen werden kann. Ich glaube, wir reden gerade aneinander vorbei.

Weglassen ist immer so eine Sache, gerade bei C++. cdecl ist zwar die Standardkonvention, aber das heißt nicht viel, einige IDEs/Compiler verwenden da einfach mal Konfigurationen, bei denen man schnell die Standardkonvention ändern kann und es bei der Verwendung von DLLs/SOs dann kracht. Besser explizit angeben und auf der sicheren Seite sein! An sich ist stdcall nur der Standard unter Windows (die MS-Dlls greifen i.d.R: auf stdcall zurück).


Zitat:

Zitat von EWeiss
Meine aktuellen probleme jetzt noch..
Code:
void BASSVISDEF(BASSVIS_WINAMP_SetStateCallback)(BASSVIS_STATECALLBACK callback);
auch der pointer bei BASSVIS_STATECALLBACK rechts oder links ?

Wenn BASSVI_STATECALLBACK schon per TypeDef zum Funktionszeiger gemacht wurde, brauchst Du hier keinen Stern mehr.

Zitat:

Zitat von EWeiss
Code:
void BASSVISDEF(BASSVIS_ExecutePlugin)(BASSVIS_EXEC* Param, BASSVIS_PARAM out Base);
Delphi-Quellcode:
procedure BASSVIS_ExecutePlugin(Param: PBASSVIS_EXEC;
    var Base: TBASSVIS_PARAM
); stdcall; external dllfile;
bin mir nicht sicher was ich von Delphi 'var' in C 'out' übergeben soll.

Auf const, var und out solltest Du lieber verzichten, die schränken eben die Kompatiblität ein. Wenn Du einen Zeiger übergibst, dann hast Du automatisch den Effekt von var, sobald Du den dereferenzierst schreibst Du schließlich direkt in den "echten" Speicher der übergebenen Variable und veränderst keine Kopie. Für out gilt das gleiche, nur dass Delphi hier vorher den Bereich leeren würde, ist aber eben nur nice-to-have, nicht nötig!

EWeiss 2. Aug 2007 16:14

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Weiss nicht ob ich das richtig rübergebracht habe

Delphi-Quellcode:
procedure BASSVIS_ExecutePlugin(Param: PBASSVIS_EXEC;
    var Base: TBASSVIS_PARAM
); stdcall; external dllfile;
Base gibt mir aus Delphi einen wert zurück über die Variable 'var'
Geschieht das in C automatisch ??

so wie ich deine Aussage verstanden habe benötige ich in C keine Varable vor Base.

Müßte dann so aussehen

Code:
void BASSVISDEF(BASSVIS_ExecutePlugin)(BASSVIS_EXEC* Param, BASSVIS_PARAM* Base);
Ist aber dann ein pointer(zeiger) auf die Structur soll aber einen wert der sich in Base befindet zurückgeben.

Vestehe ich jetzt nicht so richtig.

Gruss Emil

EDIT:
Code:
int BASSVISDEF(BASSVIS_SetPlayState)(BASSVIS_PARAM* Param, PlayState State, int value = -1);
Denke das wäre dann mein letztes problem
Playstate ist enum muss auch hier ein Stern übergeben werden?

Code:
int BASSVISDEF(BASSVIS_SetPlayState)(BASSVIS_PARAM* Param, PlayState* State, int value = -1);

Apollonius 2. Aug 2007 16:20

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Wenn du in Delphi einen Parameter als var deklarierst, macht der Compiler dass, was du in C explizit hinschreiben musst: nicht der Wert der Variablen, sondern ihre Adresse wird übergeben. Somit ist die C-Deklaration in dieser Hinsicht korrekt, wenn man mal davon absieht, dass du anscheinend _stdcall vergessen hast (hinter das void).

EWeiss 2. Aug 2007 16:21

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Zitat:

Zitat von Apollonius
Wenn du in Delphi einen Parameter als var deklarierst, macht der Compiler dass, was du in C explizit hinschreiben musst: nicht der Wert der Variablen, sondern ihre Adresse wird übergeben. Somit ist die C-Deklaration in dieser Hinsicht korrekt, wenn man mal davon absieht, dass du anscheinend _stdcall vergessen hast (hinter das void).

Hmmm wo vergessen?

Code:
void _stdCall BASSVISDEF(BASSVIS_ExecutePlugin)(BASSVIS_EXEC* Param, BASSVIS_PARAM out Base);
?? korrekt

oder
Code:
void _stdCall BASSVISDEF(BASSVIS_ExecutePlugin)(BASSVIS_EXEC* Param, BASSVIS_PARAM* Base);
gruss Emil

Apollonius 2. Aug 2007 16:30

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Jetzt ist das _stdcall richtig.
Zur zweiten Frage: Ein Stern genau dann, wenn in Delphi ein Zeiger oder ein var.

Diese out-Schreibweise kenne ich nicht, ich weiß nicht, ob das kompatibel ist. Zur Sicherheit würde ich
BASSVIS_PARAM * Base empfehlen.

Man editierst du schnell. Da will man gerade die Lösung posten, und du schlägst sie schon vor.

EWeiss 2. Aug 2007 16:37

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Zitat:

Zitat von Apollonius
Man editierst du schnell. Da will man gerade die Lösung posten, und du schlägst sie schon vor.

Jo sorry ;)

Nur noch zwei fragen

Code:
BASSVIS_PARAM* BASSVISDEF(BASSVIS_GetPluginHandle)(BASSVIS_KIND_T Kind, char *Pluginfile);
Richtig ?

Dann nochmal das hier!

Code:
int BASSVISDEF(BASSVIS_SetPlayState)(BASSVIS_PARAM* Param, PlayState State, int value = -1);
Playstate ist enum muss auch hier ein Stern übergeben werden?

Code:
int BASSVISDEF(BASSVIS_SetPlayState)(BASSVIS_PARAM* Param, PlayState* State, int value = -1);
gruss und danke Emil

EDIT:
Noch vergessen kennt C HWND oder besser als DWORD deklarieren?

Apollonius 2. Aug 2007 16:49

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
@1: vermute ich richtig, dass in der ersten Klammer der Name steht, wie er in der DLL definiert ist? Wenn ja - wo sagst du, woraus und dass er importieren soll?
@2:
Zitat:

Ein Stern genau dann, wenn in Delphi ein Zeiger oder ein var.
Hier also kein Stern.
@edit: ausprobieren.

EWeiss 2. Aug 2007 16:55

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Zitat:

vermute ich richtig, dass in der ersten Klammer der Name steht, wie er in der DLL definiert ist? Wenn ja - wo sagst du, woraus und dass er importieren soll?
verstehe nicht was du jetzt meinst.
In der ersten Klammer steht die Funktion wie in Delphi Deklariert.
BASSVISDEF ist die Definition für die LIB

Delphi-Quellcode:
function BASSVIS_GetPluginHandle(Kind: TBASSVIS_KIND_T;
    Pluginfile: PChar
): PBASSVIS_PARAM; stdcall; external dllfile;
Ist der Stern dann nicht richtig?
Code:
BASSVIS_PARAM* BASSVISDEF(BASSVIS_GetPluginHandle)(BASSVIS_KIND_T Kind, char *Pluginfile);

EDIT:
Hab mal ne neue Type deklariert
Code:
typedef DWORD HWND;
Kann nicht verkehrt sein ;)
Ausprobieren kann ich nicht da ich mich in C nicht auskenne.

gruss Emil

Der_Unwissende 2. Aug 2007 17:01

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Zitat:

Zitat von EWeiss
Ist der Stern dann nicht richtig?
Code:
BASSVIS_PARAM* BASSVISDEF(BASSVIS_GetPluginHandle)(BASSVIS_KIND_T Kind, char *Pluginfile);

Da ist der richtig!

Zitat:

Zitat von EWeiss
EDIT:
Hab mal ne neue Type deklariert
Code:
typedef DWORD HWND;
Kann nicht verkehrt sein ;)
Ausprobieren kann ich nicht da ich mich in C nicht auskenne.

Äh, warum tust Du das?! Es gibt den Typen HWND natürlich schon in C, dass der auch nur ein DWORD ist stimmt zwar, aber es sollte Dir klar sein, dass Du nicht einfach alle Windows-Standardtypen neu deklarieren solltest! Schau einfach in das Windows PSDK, da findest Du die im Windows-API angegebenen Header, die wiederum die Standardtypen enthalten!

EWeiss 2. Aug 2007 17:10

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
Zitat:

Äh, warum tust Du das?! Es gibt den Typen HWND natürlich schon in C, dass der auch nur ein DWORD ist stimmt zwar, aber es sollte Dir klar sein, dass Du nicht einfach alle Windows-Standardtypen neu deklarieren solltest! Schau einfach in das Windows PSDK, da findest Du die im Windows-API angegebenen Header, die wiederum die Standardtypen enthalten!
Gut werde sie wieder entfernen.. ;)
Bin mir nur nicht sicher ob C HWND aktzeptiert oder ob hier groß oder Kleinschreiben beachtet werden mus.

gruss Emil

EWeiss 2. Aug 2007 21:45

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?
 
danke für eure Hilfe...
Wenn jetzt noch probleme sind müssen sich die Developer halt selber helfen.

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz