Externe Calls - Umwandlung von C nach Purebasic

Für allgemeine Fragen zur Programmierung mit PureBasic.
TheMaster
Beiträge: 8
Registriert: 15.01.2005 20:18

Externe Calls - Umwandlung von C nach Purebasic

Beitrag von TheMaster »

Hallo Zusammen,

als Newbie habe ich eine Frage: Könnte mir jemand erklären, wie ich externe Calls zu einer DLL (Code liegt in C++ vor (siehe unten)) in PB deklariere? Vielen Dank!!!

Code:
----------------

extern winampGeneralPurposePlugin *gen_plugins[256];

typedef winampGeneralPurposePlugin * (*winampGeneralPurposePluginGetter)();

----------------
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Wenn Du DLLs in PureBasic verwenden willst, solltest Du auf jeden Fall die Befehle der 'Library' -Lib im Referenz-Handbuch ansehen.
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
TheMaster
Beiträge: 8
Registriert: 15.01.2005 20:18

Beitrag von TheMaster »

Andre hat geschrieben:Wenn Du DLLs in PureBasic verwenden willst, solltest Du auf jeden Fall die Befehle der 'Library' -Lib im Referenz-Handbuch ansehen.
Hallo Andre,

danke für den Tipp! Die Funktionen via Call aufzurufen oder die eigenen Prozeduren zuschreiben ist nicht das besonders große Problem, aber da ich leider kein C++ kann, habe ich halt noch ein wenig Probleme Teile davon in PB umzusetzen. Nachfolgend einmal das, was ich bisher umsetzen konnte, wobei die beiden markierten Teile eben fehlen.
Vielleicht bin ich ja auch einfach nur zu blöd :cry:

Original: in C++

Code: Alles auswählen

typedef struct {
	int version;
	char *description;
	int (*init)();
	void (*config)();
	void (*quit)();
	HWND hwndParent;
	HINSTANCE hDllInstance;
} winampGeneralPurposePlugin;

#define GPPHDR_VER 0x10

extern winampGeneralPurposePlugin *gen_plugins[256];
typedef winampGeneralPurposePlugin * (*winampGeneralPurposePluginGetter)();

In PB:

Code: Alles auswählen

Structure winampGeneralPurposePlugin 
  version.w
  description.s
  Init.l                ;## 
  Config.l            ;## These pointers to standart routines. 
  Quit.l               ;## 
  hwndParent.l    ;## Filled by Winamp . 
  hDllInstance.l
EndStructure 

#GPPHDR_VER 0x10

;
extern winampGeneralPurposePlugin *gen_plugins[256];
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; Hier mit weiß ich leider noch gar nichts anzufangen1
;
typedef winampGeneralPurposePlugin * (*winampGeneralPurposePluginGetter)();
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; Hier mit weiß ich leider noch gar nichts anzufangen1



Procedure Init(*winampGeneralPurposePlugin)
  MessageBox_(*hwndParent,"Init !","Init by Pure Basic",#MB_OK) 
EndProcedure

Procedure Config(*winampGeneralPurposePlugin) 
    MessageBox_(*hwndParent,"Config !","Config",#MB_OK) 
EndProcedure   
  
Procedure Quit(*winampGeneralPurposePlugin)
  MessageBox_(*hwndParent,"Bye, Bye!","Quit",#MB_OK) 
EndProcedure
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag von MARTIN »

Um extern must du dich nicht weiter kümmern man braucht es in C/C++ wenn man mit mehreren Dateien arbeitet, also:

Code: Alles auswählen

C/C++ extern winampGeneralPurposePlugin *gen_plugins[256];
PB Dim gen_plugins.winampGeneralPurposePlugin(256)
Wenn es typedef in PB gibt das habe ich es voll übersehen.
Das Schlösselwort typedef lässt einfach ein Dateintyp mit einem neuen aussagekräftigen Namen versehen. Mehr tut es nicht.

Code: Alles auswählen

C/C++ typedef   winampGeneralPurposePlugin (*winampGeneralPurposePluginGetter)();
PB ???
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
TheMaster
Beiträge: 8
Registriert: 15.01.2005 20:18

Beitrag von TheMaster »

MARTIN hat geschrieben:Um extern must du dich nicht weiter kümmern man braucht es in C/C++ wenn man mit mehreren Dateien arbeitet, also:

Code: Alles auswählen

C/C++ extern winampGeneralPurposePlugin *gen_plugins[256];
PB Dim gen_plugins.winampGeneralPurposePlugin(256)
Wenn es typedef in PB gibt das habe ich es voll übersehen.
Das Schlösselwort typedef lässt einfach ein Dateintyp mit einem neuen aussagekräftigen Namen versehen. Mehr tut es nicht.

Code: Alles auswählen

C/C++ typedef   winampGeneralPurposePlugin (*winampGeneralPurposePluginGetter)();
PB ???
Hallo Martin,

tausend Dank, hast mir sehr geholfen :allright:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

MARTIN hat geschrieben:Wenn es typedef in PB gibt das habe ich es voll übersehen.
meinst du dieses?
Syntax

Deftype.<Typ> [<Variable>, <Variable>,...]

Beschreibung

Wenn keine <Variablen> angegeben werden, wird DefType benutzt, um den Standardtyp ("Default type") für zukünftige typenlose Variablen festzulegen. Der anfängliche Standardtyp ist Long (.l).
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag von MARTIN »

Nein.
Mit Deftyp kannst einem Datentyp keinen neuen Namen geben, kannst nur Variablen eines Datentyps definieren.
Also das geht nicht:

Code: Alles auswählen

Deftype.l vierbytevariable
variable1.vierbytevariable
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

verstehe...

da gäbe es dann nen umweg über Structure,
aber dann muss beim Variablen-Aufruf später immer ein .irgentwas folgen :(
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten