Hallo alle zusammen, ich habe da mal eine bescheidene Frage, also erst einmal kurz eine Erleuterung dazu :
Ich habe jetzt in der DLL die folgenden Konstanten geschrieben :
Code:
// BOOLEANS
tFALSE = 0;
tTRUE = 1;
tIS_INIT = FALSE;
tIS_EXIT = FALSE;
tIS_ACTIVE = FALSE;
Und dann habe ich z.B. die folgende Function, auch in der DLL, die dann exportiert wird :
Code:
function tInitEngine(): Boolean;
Im Programm mache diese dann wie folgt bekannt :
Code:
function tInitEngine():Boolean; external;
Wenn ich diese Function nun aufrufe, möchte ich als booleanischen Rückgabewert z.B. mit tIS_INIT im Game (der EXE) arbeiten, jetzt meine Frage : Wie kann ich das realisieren ?
_________________ Gruß Sascha [SM3D Game Development]
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also ich weiß jetzt nicht ganz was dein Problem ist aber jede Funktion hat eine Variable namens Result. Und wenn du da was rein schreibst kommt das auf der anderen Seite auch wieder raus. Hat das jetzt deine Frage beantwortet? Wenn nicht, dann erkläre mal bitte was du genau vor hast.
Ja Du hast recht ist ein bisschen falsch erklärt denke ich. Also ich möchte z.B. die Funktion tInitEngine() in meinen Spiel aufrufen und das Erginis für die Fehlerbehandlung auswerten. Also ich möchte dann z.B. mit einer IF Schleife abfragen ob das Resultat tIS_INIT = TRUE oder FALSE ist.
Zum zweiten finde ich in der Delphi Hilfe nicht wie das mit dem einbinden der DLL funktioniert, so das ich dann die Funktionen alle nutzen kann, bei C++ binde ich in den Projekt Optionen ja z.B. zu der Titan.dll meine Titan.lib ein und habe dann auf die ganzen Funktionen zugriff beim coden.
_________________ Gruß Sascha [SM3D Game Development]
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich glaube ich habe jetzt eine Ahnung was du meinst.
Es gibt zwei Möglichkeiten zum einbinden von DLL's.
Du machst einmal LoadLibrary und dann für die Methoden getProcAddress. Ein Beispiel davon findest du in der dglOpenGL.pas oder in der OpenGl12.pas.
(dynamisches Laden)
Oder die zweite Möglichkeit mithilfe der Direktive External.
Dazu kann ich nur auf die Delphi Hilfe verweisen. Besser kann man es nicht beschreiben. (F1 auf external)
(statisches Laden)
Und zu deinem anderen Problem. Da solltest du eine Methode machen die einen Fehlercode zurück gibt. Es gibt (leider) (meines wissens) keine Möglichkeit auf Variablen innerhalb einer DLL zugreifen zu können. Du könntest für jede Variable eine Methode machen um deren Wert abzufragen. Aber da ist es besser du definierst dir irgendwo ein paar Fehlercodes und testest in der Methode in deiner DLL, was falsch ist und lieferst den dementsprechenden Fehlercode zurück. Oder dementsprechend den Fehlercode 0 der normalerweise angibt, dass alles Chlor ist.
Ja Danke das mit der DLL, also diese zu laden habe ich mit external gemacht.
[EDIT SM3D] -> Code nachträglich gelöscht, da dieser VIEL zu groß war, @SoS danke nochmal für den Hinweis, manchmal idt man so in der Materie und vergisst die guten Grundsetze.
_________________ Gruß Sascha [SM3D Game Development]
WERBUNG für ein gutes Projekt
Zuletzt geändert von SM3D am Sa Feb 14, 2004 15:05, insgesamt 1-mal geändert.
Registriert: Mo Jan 20, 2003 20:10 Beiträge: 424 Wohnort: nähe Starnberg
Hi,
Code:
if result = tIS_INIT(FALSE) then
tLog.tWriteToLog('Engine konnte nicht initialisiert werden...',TRUE)
ich finde diese Schreibweise sehr seltsam. Du konvertierst einen Booleanwert in einen anderen Booleanwert. Desweiteren ist Result bei Dir nie initialisiert worden. Result bezieht sich auf die Funktion im aktuellen Block und nicht auf andere Funktionen.
Ich würde das anders schreiben:
Code:
// Funktion zum initialisieren der Engine
function tInitEngine(): tIS_INIT;
begin
// Hier wird die Log initialisiert
Result := tInitLog;
// Hier wird OpenGL initialisiert
if Result then begin
Result := glInit;
end;
// HIER alles andere initialisieren
if not Result then
tLog.tWriteToLog('Engine konnte nicht initialisiert werden...',TRUE)
else
tLog.tWriteToLog('Engine wurde initialisiert...',TRUE);
end;
Hat es irgendeine Bedeutung, warum 2 neue Type tIS_INIT und tIS_EXIT definierst, die auch nur 2 oder 3 Stellen im Code verwendet werden?
Gruß
KidPaddle
PS.: Die 1 zu 1 Übersetzung von C++ nach Delphi ist nicht unbedingt die beste Lösung, da man viele Eigenheiten von C++ versucht in Delphi nach zubilden.
Ja Danke Dir, die C++ Story diente nur dem Sinnbild, damit meine schlechte Erklärung ein wenig ausgeglichen wird *g*.
Danke für die Hilfe mit der IF Schleife und den Result, so wie ich das jetzt sehe ist das nun genau wie ich das haben möchte, aber das könnte echt sein das ich noch viel von C++ im Kopf habe.
Das tIS_INIT gilt nur für die Initialisierung der Engine als Result und das tIS_EX_EXIT halt nur für die Exit Funktion, um dort das Resultat zu erfragen.
_________________ Gruß Sascha [SM3D Game Development]
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
SM3D hat geschrieben:
Result := tInitLog; <<<-------------- Man kann Boolean keine Procedure zuweisen
Das halte ich aber für ein Gerücht. Da muss irgendwas mit deiner Methode nicht richtig sein. Warum machst du eigentlich neue Booleantypen? Es fordert (für außenstehende) auch nicht gerade die Lesbarkeit deines Programmes. Und wer weiß. Wo möglich bekommst du dadurch ja auch noch Schwierigkeiten mit den Typen und den Zuweisungen.
Sorry, aber das war die Compilermeldung. Eigentlich sollen die neuen Typen es verfeinfachen damit zu arbeiten, das scheint aber nicht der Fall zu sein. Hey und ich wollte hier keinem auf dem Fuß trampeln.
Achso hatte was vergessen , wenn ich das so schreibe :
result := tIS_INT;
sagt der Compiler "( erwartet aber ; gefunden"
_________________ Gruß Sascha [SM3D Game Development]
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Ich frag mich auch warum du das so kompliziert machst...warum nicht so :
Code:
type
TIsInit = Boolean;
...
function tInitEngine : Boolean;
begin
...
Result := Init;
end;
...
function xyz;
if tInitEngine = TIsInit then...
end;
Warum neue Typen als Funktionsergebnis deaklarieren, wenn der neue Typ sowieso in anderer Form vorhanden ist?Und kleiner Hinweis : Unterstriche sind eine Unsitte aus C(++), und bei Delphi musst du auch keine leeren Klammern setzen.
nachdem ich so lange Zeit abwesend war (Sorry, totaler Zeitmangel), habe ich die HTML Log Geschichte nun als DLL gelöst, diese werde ich dann im Januar hier Online stellen.
Danke an alle die mich hier bei diesem Thema unterstützt haben, danke ebenfalls an das Delphi GL Team, das ich trotz der langen inaktivität hier noch nicht rausgeflogen bin *g*.
Ab Januar werde ich dann wieder richtig aktiv werden können, bis dahin ist mein jetziges Projekt NGM (Necromunda Gang Manager für das Tabletopspiel Necromunda von Games Workshop) beendet sein.
Viele nette Grüße an alle Delphi GL User und natürlich das Team hier. Eine fröhliche Weinachten und einen guten Rutsch ins neue Jahr, falls wir uns vorher nicht mehr lesen.
SM3D (Sascha)
_________________ Gruß Sascha [SM3D Game Development]
Mitglieder in diesem Forum: 0 Mitglieder und 54 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.