Delphi in C++ umwandeln
-
wen du uns die daten nicht zeigst könenn wir dir auch nicht helfen,
ich mein die impl^^edit:
dort ist die rede von einem index
ist das ein array oder wie?
wo hast du es deklariert wenn nicht => kein wunder das es nicht funzt
-
Wie gesagt der Delphi code ist nur ein ausschnitt. Die dll bekomm ich nicht geöffnet (borland öffnet die gar net und bei editor kommt nur zeichensalat da raus). ich hab mit dlls vorher noch nicht gearbeitet.
Bringt das was wenn ich dir die schicke??Das sind 3 funktionen die die dll machen soll. den lpt öffnen, schließen und daten senden.
-
du must schon mit der impl raus rücken^^
-
unit fiche1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) ListeIF: TComboBox; ButStart: TButton; ButStop: TButton; BarChan: TScrollBar; BarData: TScrollBar; Label1: TLabel; Label2: TLabel; VisuChan: TLabel; VisuData: TLabel; procedure FormDestroy(Sender: TObject); procedure ButStartClick(Sender: TObject); procedure ButStopClick(Sender: TObject); procedure BarDataChange(Sender: TObject); procedure BarChanChange(Sender: TObject); private { Déclarations privées } Procedure SendDMXData; public { Déclarations publiques } end; Function OPEN_LPT_INTERFACE (Number : Integer) : Integer; Stdcall; External 'LPT_DMX.DLL' index 3; Procedure CLOSE_LPT_INTERFACE; Stdcall; External 'LPT_DMX.DLL' index 4; Procedure SEND_DMX_COMMAND (Channel, Data : Integer); Stdcall; External 'LPT_DMX.DLL' index 5; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormDestroy(Sender: TObject); begin CLOSE_LPT_INTERFACE; end; [....]
Das ist alles was ich hab, das ist mein Problem. Ein funtionierendes delphi programm, das ich gerne in c++builder erweitern bzw. neu programmieren will. und um die hardware anzusteueren muss ich diese drei funktionen haben. Laut Hersteller soll es gehen. er verrät aber nicht wie.
Villeicht hilft dir die Readme weiter:
This library allows to control the LPT/DMX interface, without knowledge of parallel ports programming under WINDOWS.
The library is compatible with any WIN32 compiler, since the compiler is able to handle DLLs (DELPHI, C++ BUILDER, Visual BASIC, Visual C++, etc..)
The library is provided "as is", with no warranty. No help will be given by author for the use of the files.
You are free to use and modify all the files, at your own risks.Parameters types
INTEGER : SIGNED 32 BITS
PCHAR : 32 BITS POINTER ON 1st ELEMENT OF CHAR ARRAYFunction OPEN_LPT_INTERFACE (NUMBER : INTEGER) : INTEGER;
Returns 0 if interface not available
Returns 1 if interface is available and activated
NUMBER is the port number on which LPT/DMX interface is connected (1=LPT1, 2=LPT2 et 3=LPT3). Only LPT1 to LPT3 ports are supported.
WARNING : if the function returns 1 (activated), it is MANDATORY to call CLOSE_LPT_INTERFACE when the application using the DLL closes.Function CLOSE_LPT_INTERFACE;
This function returns no value (VOID). It must be called before closing the application that uses the DLL if the parallel port has been successfully activated.Function SEND_DMX_COMMAND (CHANNEL, DATA : INTEGER);
This function returns no value (VOID). It can only be used if OPEN_LPT_INTERFACE returned the value 1.
CHANNEL parameter must have a value between 1 and 480. It represents the DMX channel to control.
DATA parameter must have a value between 0 and 255. It represents the DMX value sent on the selected DMX channel.
-
glaube kaum das hier jemand was mit dem ganzen code anfangen kann
kannst du nicht dich auf das wichtiste beschrenken??^^PS
probiers mal mit LoadLibrary und GetProcAddress
damit kanste dlls laden und funktionen daraus holen
-
Das wichtigste hab ich am Anfang hingeschrieben.
Das hat ja nicht gereicht.Der Boarland kennt die Befehle nicht. ich kann weder noch was in der hilfe darüber finden, noch gibt mir der compiler ein ok dazu.
Hast du nicht mal ein beispiel wie ich das eingeben müsste?
Danke nochmal für deine mühe.
-
int (* OPEN_LPT_INTERFACE)(int); // funktionszeiger //dll laden HMODULE m = LoadLibrary("LPT_DMX.DLL"); // funktion laden // du must kucken wie die funktion in der dll tatsechlich heisst und den string dann dadurch ersezen OPEN_LPT_INTERFACE = (int(*)(int))GetProcAddress(m, "OPEN_LPT_INTERFACE");
jetzt kansnt du die funktion aufrufen
OPEN_LPT_INTERFACE(1);
dazu musst du <windows.h> inkluden^^
-
und wie guck ich das in der dll nach?
-
WOW, die letzten 2 strummelbunzi Kommentare enthalten sogar wertvolle Hinweise für Dich!
Den Rest von ihm (?) solltest Du aber vorausschauenderweise ignorieren.
Zunächst einmal solltest Du Dich vertraut damit machen, wie man mit DLLs umgeht. (google)
Dann verstehst Du auch, warum man sie in C++ Builder nicht "laden" kann oder sie im Editor wie Schrott aussehen.JBOpael schrieb:
Da wo ich im Moment hänge ist diese Passage:
Function OPEN_LPT_INTERFACE (Number : Integer) : Integer; Stdcall; External 'LPT_DMX.DLL' index 3; Procedure CLOSE_LPT_INTERFACE; Stdcall; External 'LPT_DMX.DLL' index 4; Procedure SEND_DMX_COMMAND (Channel, Data : Integer); Stdcall; External 'LPT_DMX.DLL' index 5;
Eine Function in Pascal (Delphi) ist eine Funktion mit Rückgabewert in C/C++ - der Typ des Rückgabewerts steht mit Doppelpunkt dahinter.
Eine Procedure ist eine Funktion ohne Rückgabe - in C/C++ halt void.Stdcall ist die Aufrufkonvention (wie im Maschinencode nachher die Argumente übergeben werden).
External heißt einfach, daß die Funktion hier nicht implementiert ist, sondern sie aus der DLL geladen wird.
In C wären das folgende Funktionsprototypen:
int OPEN_LPT_INTERFACE(int Number); void CLOSE_LPT_INTERFACE(void); void SEND_DMX_COMMAND(int Channel, int Data);
DLLs sind Windows-only und gehören daher ins WinAPI-Forum.
Vielleicht bist Du aber im BCB Forum besser aufgehoben - ggf. gibt's dort 'ne andere (einfachere) Vorgehensweise zum Laden von DLLs.
-
Vielleicht auch mal in den FAQs was blättern...
-
Diese "index x" Befahlen könnten ordinal values für die Funktionen sein. Das heißt es wird nicht der Name der Funktion exportiert sondern diese Nummer. Einen Blick in die Doku von GetProcAdress sollte aber verraten wie du diese dynamisch laden kannst. Desweiteren glaub ich, dass ein Pascal Integer einen C/C++ short entspricht. Bin mir aber nicht sicher.
Wenn du die Library statisch linken willst dann musst du dir wohl ein Module definition File (*.def) schreiben und diese dann zu einer Importlibrary kompilieren.
Für MinGW dürfte das in etwa so aussehen:
LIBRARY LPT_DMX.DLL EXPORT OPEN_LPT_INTERFACE 3 CLOSE_LPT_INTERFACE 4 SEND_DMX_COMMAND 5
Dies würdest du dann mit dem dlltool zu einer Importlibrary verpacken.
So nun noch ein dazu passender Header
#ifndef LPT_DMX_H #define LPT_DMX_H #ifndef __cplusplus extern "C"{ #endif short __declspec(dllexport) __stdcall OPEN_LPT_INTERFACE(short number) void __declspec(dllexport) __stdcall CLOSE_LPT_INTERFACE() void __declspec(dllexport) __stdcall SEND_DMX_COMMAND(short channel, short data) #ifndef __cplusplus } #endif #endif
Du könntest auch in beiden .def und .h bessere Namen wählen wie zum Beispiel OpenLPTInterface. Hier solltest du freie Wahl haben.
Unter Umständen auch short durch int ersetzen. Es könnte sein, dass dir mit short manche Compiler optimirungen in die Quer kommen.
-
Vielen Dank für die Antwort, entlich mal etwas womit ich was anfangen kann.
Das ganze muss ich jetzt erst mal verdauen. hätte nicht gedacht das es so "kompliziert" ist.
Ich werd das mal testen und mich dann wieder melden ob es funtioniert hat oder nicht.
tausend dank schonmal!!!
-
kleine frage hab ich aber noch!!
Was ist minGW ?? und was für ein dlltool ??
hört sich etwas stümperhaft an, aber bei sowas steh ich ich noch am anfang.
-
MinGW ist die Windows-Version vom gcc (Gnu Compiler Collection).
dlltool kenne ich selbst nicht.
-
short ist falsch es mus int sein den da steht integer:32 bit^^
-
strummelbunzi schrieb:
short ist falsch es mus int sein den da steht integer:32 bit^^
In der Tat, aber nur in der Readme.
dlltool ist ein program das bei den MinGW binutils bei liegt.
Welchen Compiler benutzt du?
Du könntest auch versuchen wie von strummelbunzi vorgeschlagen die Funktionen dynamisch zu laden.
typedef int (__stdcall * OpenLPTInterfaceFunc)(int); OpenLPTInterfaceFunc open_lpt_interface; //dll laden HMODULE m = LoadLibrary("LPT_DMX.DLL"); // Funktion laden open_lpt_interface = (OpenLPTInterfaceFunc)GetProcAddress(m, "OPEN_LPT_INTERFACE"); //oder open_lpt_interface = (OpenLPTInterfaceFunc)GetProcAddress(m, "_OPEN_LPT_INTERFACE"); //oder open_lpt_interface = (OpenLPTInterfaceFunc)GetProcAddress(m, (LPCSTR)3); //oder open_lpt_interface = (OpenLPTInterfaceFunc)GetProcAddress(m, (LPCSTR)(3 << 16))
Musst halt ein wenig ausprobieren.
-
erst mal vielen Dank für die zahlreichen Antworten.
Aber ich bin da irgendwie zu dämlich für!!
Alles was ihr bis jetzt geschrieben habt bekomm ich entweder nicht umgesetzt oder es funktioniert nicht.
Ich hab gelesen das man mit dem wintool von borland aus ner dll ne def ziehen kann, aber das funzt bei mir auch net.Mit MinGW komm ich nicht klar.
Ich frag das zwar nicht gerne, aber kann ich nicht einen von euch die daten schicken, und ihr wandelt mir das so um das ich mit den drei funtionen arbeiten kann? ich hab gestern bis 5 uhr dran gehangen und heute sitz ich auch schon 2 std davor. So langsam sind meine nerven im keller.
Das wär echt nett von euch.
Danke
PS wie schon geschrieben ich hab den borland compiler
-
wi wärs mit dem GNU p2c ??
der wandelt pascal in C um...Mfg SHade37337
p.s. und den gibts auch für windoof..!!!
sowas is ja nur fielhandlig dass liesse sich mit C++ STD machen...
-
Das hört sich nicht schlecht an, aber kann es sein das das teil nur für linux gibt??
-
wenn du c++ builder verwendest, dann brauchst du nicht mal den Quelltext zu konvertieren. binde einfach die *.pas -Datei in dein Projekt ein. Der Compiler generiert daraus eine .hpp-Datei die du dann includen kannst.
Der Integer-Delphi-Typ ist 32bit. Zumindest war er in der Version 5.0. Ich sehe aber keine Vorteile darin warum sich das geändert haben sollte. Außer vielleicht für != 32Bit-Prozessoren.