Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 18.05.2021, 15:58 Titel: Kompilierung trotz fehlender Bibliothek/Quellcodes |
|
|
Gibt es eine Möglichkeit, ein Programm zu kompilieren, trotz fehlender .bi/.bas Datei? Normalerweise kommt immer eine Fehlermeldung, wenn ich versuche ein Programm zu kompilieren und eine Datei fehlt. Ich stelle mir das so vor, dass in dem Quellcode eine .bi oder .bas Datei nur dann eingebunden bzw. ausgeführt wird, wenn die Datei vorhanden ist! Gibt es da einen Befehl, der das Code: | #INCLUDE "TEST.BAS" | überspringt? Ich möchte ein Programm schreiben, aber einen Teil vom Quellcode nicht mitliefern oder mitgeben. Ich könnte zwar die entsprechende Stelle im Quellcode als Kommentar versehen, aber das will ich wenn möglich vermeiden. Vor allem, da es zu aufwendig ist, jedes mal 100 Zeilen zu ändern. _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4604 Wohnort: ~/
|
Verfasst am: 18.05.2021, 18:02 Titel: |
|
|
Vielleicht so etwas in der Art;
Code: | #DEFINE INCLUDEHIDDENFILES
#IF DEFINED INCLUDEHIDDENFILES
#INCLUDE "only4themaster.bi"
#ENDIF |
und dann mittels #DEFINE alle Stellen so umformen, dass sie für den Fall, dass INCLUDEHIDDENFILES nicht definiert ist, auf irgendeinde Fallback-Option zurückfallen.
Allerdings erschließt sich mir der Sinn nicht ganz - wenn man auch ohne die geheimen Codeabschnitte ein compilierbares und funktionsfähiges Programm erhält, braucht es diese geheimen Codebschnitee offenbar gar nicht? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 18.05.2021, 18:19 Titel: |
|
|
nemored hat Folgendes geschrieben: | Vielleicht so etwas in der Art;
Code: | #DEFINE INCLUDEHIDDENFILES
#IF DEFINED INCLUDEHIDDENFILES
#INCLUDE "only4themaster.bi"
#ENDIF |
und dann mittels #DEFINE alle Stellen so umformen, dass sie für den Fall, dass INCLUDEHIDDENFILES nicht definiert ist, auf irgendeinde Fallback-Option zurückfallen.
Allerdings erschließt sich mir der Sinn nicht ganz - wenn man auch ohne die geheimen Codeabschnitte ein compilierbares und funktionsfähiges Programm erhält, braucht es diese geheimen Codebschnitee offenbar gar nicht? |
Vielen herzlichen Dank für die Antwort! Maul schauen, ob das funktioniert?
Der Sinn des Ganzen ist ganz einfach: In der exe-Datei fehlt ein Teil der Funktionen, da diese beim Kompilieren nicht gelesen bzw. eingebunden wurden. Jene Funktion sollte nur bei mir vorhanden sein, da ich den fehlenden Quellcode besitze. Jemand der den fehlenden Quellcode nicht besitzt, sollte das Programm auch ohne dem fehlenden Quellcode kompilieren können. Es ist quasi eine Funktion, die nicht für jeden freigegeben ist.
Edit:
Funktioniert leider nicht! Der Compuiler meldet mir immer, dass die Datei fehlt... _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 18.05.2021, 18:54 Titel: |
|
|
Du musst auch alle abschnitte, welche auf diese .bi zugreifen, mit einem
Code: | #if defined INCLUDEHIDDENFILES
aufruf von funktionen aus der .bi
'ENDIF
|
einkapseln.
beispiel:
.test.bi
Code: | sub def()
Print "def"
end sub |
test.bas
Code: | #define HIDDENBI 'Auskommentieren, wenn test.bi nicht vorhanden ist.
#if defined HIDDENBI
#include once "test.bi"
#END IF
sub abc()
print "abc"
end sub
abc()
#if defined HIDDENBI
def()
#end if
|
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 18.05.2021, 19:24 Titel: |
|
|
Zitat: | #define HIDDENBI 'Auskommentieren, wenn test.bi nicht vorhanden ist. | Genau das will ich vermeiden! Es sollte kompiliert werden können ohne dass ich etwas als Kommentar versehe. Aber mein Plan funktioniert eh nicht. Habe gerade gesehen, dass man Texte in der exe-Datei, durch öffnen der exe-Datei mit einem Texteditor lesen kann. Anscheinend werden die in der Datei als Klartext gespeichert? Wahrscheinlich bleibt mir nichts anderes übrig, dass ich ein 2. separates Programm schreibe. Ich könnte mit FreeBasic nicht einmal ein Programm schreiben, wo man einen Lizenzschlüssel braucht, weil dieser in der exe-Datei in Klarschrift lesbar ist. _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 18.05.2021, 19:44 Titel: |
|
|
du musst doch den kommentar nicht hinzufügen .. der war nur für dich, damit du weist, was du auskommentieren / löschen musst, damit das, was du vor hast, funktioniert.
Und, dieses verfahren ist expliziet genau das, was du suchst. Es verhindert, das der compiler diese elemente rein kompiliert. Du kannst (wenn du willst) auch die Kommentare in die #if defined rein packen. Dann werden sie beim kompilieren ebenfalls ignoriert.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 18.05.2021, 20:12 Titel: |
|
|
ThePuppetMaster hat Folgendes geschrieben: | du musst doch den kommentar nicht hinzufügen .. der war nur für dich, damit du weist, was du auskommentieren / löschen musst, damit das, was du vor hast, funktioniert.
Und, dieses verfahren ist expliziet genau das, was du suchst. Es verhindert, das der compiler diese elemente rein kompiliert. Du kannst (wenn du willst) auch die Kommentare in die #if defined rein packen. Dann werden sie beim kompilieren ebenfalls ignoriert.
MfG
TPM | Funktioniert leider nicht. Zuerst bekomme ich ein paar Fehlermeldungen. Diese sind weg, wenn ich die fehlenden Klammern reinschreibe.
Code: | #if defined (HIDDENBI) |
Allerdings meldet mir der Kompiler jedes mal, dass die Test.bi fehlt!
Ich habe folgenden Quellcode:
Code: | SCREENRES 640, 320, 32
#DEFINE HIDDENBI 'Auskommentieren, wenn test.bi nicht vorhanden ist.
#if defined (HIDDENBI)
#include once "test1.bi"
#ENDIF
DECLARE SUB ABC()
ABC()
#if defined (HIDDENBI)
def()
#ENDIF
SLEEP
END
SUB ABC()
PRINT "abc"
END SUB | Wie muss der Quellcode jetzt aussehen, dass das ganze bei mir ohne Test.bi funktioniert? Welchen Compiler verwendet ihr? Ich habe Version 1.07.1 _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 91
|
Verfasst am: 18.05.2021, 20:21 Titel: |
|
|
Kann man nicht zusätzlich FileExists gebrauchen? |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4604 Wohnort: ~/
|
Verfasst am: 18.05.2021, 21:15 Titel: |
|
|
FILEEXISTS funktioniert während der Laufzeit, nicht während des Compiliervorgangs.
@ALWIM: Natürlich muss Test.bi - oder in deinem Fall test1.bi - existieren, damit das laufen kann. Wenn die Datei nicht existiert, musst du die Zeile mit dem #DEFINE HIDDENBI auskommentieren, damit es trotzdem läuft. Das ist ja der Sinn des Ganzen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4604 Wohnort: ~/
|
Verfasst am: 18.05.2021, 21:23 Titel: |
|
|
Nachtrag - die vielleicht deutlich einfachere Lösung:
Du erstellst eine test1.bi mit den Funktionen, die nur du nutzen willst und die nicht weitergegeben werden sollen, und eine test2.bi mit Dummy-Funktionen zum Weitergeben. D. h. wenn test1.bi eine Funktion namens strengGeheimeAuswertungsmethode() enthält, bekommt die test2.bi ebenfalls diese Funktion, aber ohne funktionalen Inhalt - sie gibt dann halt z. B. immer den Wert 0 zurück. Dann kannst du im Quelltext, den du weitergeben willst, einfach ein #INCLUDE "test2.bi" einfügen, und wenn du für dich selbst kompilieren willst, änderst du die Zeile in #INCLUDE "test1.bi" ab. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 18.05.2021, 22:05 Titel: |
|
|
nemored hat Folgendes geschrieben: | FILEEXISTS funktioniert während der Laufzeit, nicht während des Compiliervorgangs.
@ALWIM: Natürlich muss Test.bi - oder in deinem Fall test1.bi - existieren, damit das laufen kann. Wenn die Datei nicht existiert, musst du die Zeile mit dem #DEFINE HIDDENBI auskommentieren, damit es trotzdem läuft. Das ist ja der Sinn des Ganzen. | Danke für die Antwort. Das ist ja genau das, was ich vermeiden wollte, dass ich das jedes Mal als Kommentar versehen muss oder eben auch nicht! Der Trick mit "FILEEXISTS" bei #DEFINE funktioniert auch nicht. Dann muss ich das wirklich jedes Mal als Kommentar versehen.
Beschissen irgendwie... _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 91
|
Verfasst am: 18.05.2021, 22:08 Titel: |
|
|
Man kann aber auch eine leere Datei mitliefern.
Code: | #include "Leere Datei.bi"
Print "Testversion"
Sleep |
|
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4604 Wohnort: ~/
|
Verfasst am: 18.05.2021, 22:21 Titel: |
|
|
ALWIM hat Folgendes geschrieben: | nemored hat Folgendes geschrieben: | FILEEXISTS funktioniert während der Laufzeit, nicht während des Compiliervorgangs.
@ALWIM: Natürlich muss Test.bi - oder in deinem Fall test1.bi - existieren, damit das laufen kann. Wenn die Datei nicht existiert, musst du die Zeile mit dem #DEFINE HIDDENBI auskommentieren, damit es trotzdem läuft. Das ist ja der Sinn des Ganzen. | Danke für die Antwort. Das ist ja genau das, was ich vermeiden wollte, dass ich das jedes Mal als Kommentar versehen muss oder eben auch nicht! Der Trick mit "FILEEXISTS" bei #DEFINE funktioniert auch nicht. Dann muss ich das wirklich jedes Mal als Kommentar versehen.
Beschissen irgendwie... |
Wenn du dir den Kommentar sparen willst, kannst du den Präprozessor auch explizit mit der Compiler-Option -d setzen (https://www.freebasic-portal.de/befehlsreferenz/der-compiler-458.html, Abschnitt "Bedingtes Compilieren und Präprozessor"). Ob das letztendlich bequemer ist, lasse ich dahin gestellt.
Oder du schreibst dir ein Programm, das prüft, ob eine bestimmte Datei existiert, und dann abhängig davon eine andere Datei mit speziellen Einstellungen kompiliert oder nicht.
Zur anderen Frage, die ich vorher übersehen habe: Daten, die du deinem Programm einprogrammierst, müssen auch so abgelegt werden - Strings im Quellcode werden auch wieder auffindbar sein. Aber wenn es z. B. um einen Lizenzschlüssel geht - warum liest du den nicht mittels OPEN aus einer externen Datei, die du dann bei dir behältst? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 18.05.2021, 22:30 Titel: |
|
|
Noch eine alternative:
Du schreibst eine .dll / .so welche du dynamisch zur laufzeit einbinden kannst. Dadurch kannst du vorab prüfen, ob diese dll existiert. Wenn nicht, dann lädst du sie halt nicht, und die Funktionen stehen nicht zur Verfügung. Wenn Si existiert, dann entsprechend wird sie geladen und eingebunden.
Dann brauchst du keien anpassungen im source vornehmen, weil es überall gleich bleiben kann.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 91
|
Verfasst am: 18.05.2021, 23:01 Titel: |
|
|
Vielleicht könnte man in jedem Fall eine bi-Datei einbinden.
Eine bi-Datei könnte unter anderem die Zeile #DEFINE HIDDENBI enthalten, die andere nicht.
So könnte man dem Programm verschiedene Funktionen verleihen. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1215 Wohnort: Ruhrpott
|
Verfasst am: 19.05.2021, 09:57 Titel: |
|
|
ThePuppetMaster hat Folgendes geschrieben: | Du schreibst eine .dll / .so welche du dynamisch zur laufzeit einbinden kannst... | Das wäre auf jeden Fall die sauberste Lösung (und wohl auch die einzige, die funktioniert).
Gruß
grindstone
EDIT
Hier mal ein ganz einfaches Beispiel:
Die DLL (unter dem Namen "unglaublichGeheimeMathematischeOperation.bas" im selben Verzeichnis wie das Hauptprogramm abspeichern und mit Option "-dll" compilieren): Code: | 'Die Prozedur (Function oder Sub) MUSS deklariert werden. Der Name vor dem Alias ist der Name der Prozedur
' innerhalb der .dll, mit dem Namen hinter dem Alias wird die Prozedur vom aufrufenden Programm aus
' angesprochen. Die Namen können, müssen aber nicht unterschiedlich sein.
Declare Function wurzel Alias "wurzel" (x As Double) As Double
Function wurzel(x As Double) As Double Export
Return Sqr(x)
End Function |
und hier das Hauptprogramm: Code: | Dim As Any Ptr geheimeDll
Dim As Double x
Dim wurzelaus As Function(wert As Double) As Double 'abbild der prozedur aus der .dll mit DIM statt DECLARE
geheimeDll = DylibLoad("unglaublichGeheimeMathematischeOperation") 'pointer auf die .dll
wurzelaus = DylibSymbol(geheimeDll, "wurzel") 'pointer auf die prozedur innerhalb der .dll
? geheimeDLL
? wurzelaus
?
x = 144
If geheimeDLL Then
'.dll ist vorhanden
Print "Wurzel aus"; x; " ist"; wurzelaus(x)
Else
'dll ist nicht vorhanden
Print "Woher soll ich das denn wissen?"
EndIf
Sleep |
_________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 19.05.2021, 17:08 Titel: |
|
|
hhr hat Folgendes geschrieben: | Man kann aber auch eine leere Datei mitliefern.
Code: | #include "Leere Datei.bi"
Print "Testversion"
Sleep |
| Diese Lösung, gefällt mir am allerbesten! Und funktioiert auch noch. Keine Ahnung, wieso ich da nicht selber drauf gekommen bin? Mal schauen, wie ich der Parameter übergeben kann?
Zitat: | Aber wenn es z. B. um einen Lizenzschlüssel geht - warum liest du den nicht mittels OPEN aus einer externen Datei, die du dann bei dir behältst?
| Wenn mir jemand erklärt, wie ich in der EXE-Datei den Schlüssel verstecken kann? Das Dumme ist, dass ich die EXE-Datei bloß mit einem Texteditor öffnen muss, um an den Schlüssel zu kommen!!! Egal was ich im Programm an Texte drin habe, ich kann jedes Mal den Text ganz einfach auslesen. Der ist immer sichtbar... _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2509 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
|
|