[gelöst] Problemchen mit sqlcipher.dll

Für allgemeine Fragen zur Programmierung mit PureBasic.
MenschMarkus
Beiträge: 227
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

[gelöst] Problemchen mit sqlcipher.dll

Beitrag von MenschMarkus »

Hi

Ich habe da ein kleines Problemchen mit UseSQLiteDatabase("sqlcipher.dll")
Sobald ich die DLL in mein Programm mit einbinde erhalte ich auf Testrechnern die Debugger Meldung, dass UseSQLiteDatabase() vor Benutzung eines Datenbankbefehls aufgerufen werden muss. Das ist aber der Fall (siehe code)

Code: Alles auswählen

;
UseSQLiteDatabase("sqlcipher.dll")
EnableExplicit
Define mydir.s, found.i,result.s
;
found = 0
ExamineDirectory(0,GetCurrentDirectory(),"*.db3")
While NextDirectoryEntry(0)
  If DirectoryEntryType(0) = #PB_DirectoryEntry_File
    If DirectoryEntryName(0) = "test.db3"
      found = 1
    EndIf
  EndIf
Wend
FinishDirectory(0)
If found = 0
  CreateFile(0,"test.db3")
  CloseFile(0)
EndIf
;
If OpenDatabase(0,"test.db3","","",#PB_Database_SQLite)
  DatabaseUpdate(0,"PRAGMA key = 'passkey';")
  FinishDatabaseQuery(0)
  If found = 0
    DatabaseUpdate(0,"CREATE TABLE test (field1 INTEGER,field2 INTEGER);")
    DatabaseUpdate(0,"INSERT INTO test (field1,field2) VALUES (1,1),(2,2),(3,3);")
    DatabaseQuery(0,"SELECT * FROM test;")
    While NextDatabaseRow(0)
      result + GetDatabaseString(0,DatabaseColumnIndex(0,"field1")) + " , " + GetDatabaseString(0,DatabaseColumnIndex(0,"field2")) + Chr(10)
    Wend
    FinishDatabaseQuery(0)
    MessageRequester("Hinweis",result)        
  Else
    DatabaseQuery(0,"SELECT * FROM test;")
    While NextDatabaseRow(0)
      result + GetDatabaseString(0,DatabaseColumnIndex(0,"field1")) + " , " + GetDatabaseString(0,DatabaseColumnIndex(0,"field2")) + Chr(10)
    Wend
    FinishDatabaseQuery(0)
    MessageRequester("Hinweis",result)
  EndIf
Else
  MessageRequester("Hinweis","Open Error: " + DatabaseError())
EndIf
CloseDatabase(0)
;
; Remark
; Development system: Win11 22H2 / x64
; Test system: WIN11 22H2 / x64 (different from Development System)
; Test system: Win10 22H2 / x64
Erstaunlich ist nur, dass das Programm so auf dem Entwicklungsrechner funktioniert. Nur auf Drittrechnern nicht mehr. Egal ob Win 10 oder Win 11. Die "sqlcipher.dll" liegt dem Programm immer im gleichen Verzeichnis bei.

Hab ich da was übersehen?

PS: ohne Einbindung der "sqlcipher.dll" in UseSQLiteDatabase() funktioniert das Programm, jedoch nur ohne Verschlüsselung.
Zuletzt geändert von MenschMarkus am 07.08.2023 08:15, insgesamt 3-mal geändert.
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Problemchen mit sqlcipher.dll

Beitrag von Kiffi »

MenschMarkus hat geschrieben: 03.08.2023 16:10Die "sqlcipher.dll" liegt dem Programm immer im gleichen Verzeichnis bei.
vielleicht so?

Code: Alles auswählen

UseSQLiteDatabase(GetPathPart(ProgramFilename()) + "sqlcipher.dll")
a²+b²=mc²
MenschMarkus
Beiträge: 227
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: Problemchen mit sqlcipher.dll

Beitrag von MenschMarkus »

Leider nein.
Die Debug Meldung weist irgendwie darauf hin, dass das UseSQLiteDatabase() erst gar nicht angenommen wird. Sonst würde so eine Debugger Meldung erst gar nicht erscheinen. Leider gibt PB keine Rückgabewert bei den Use Aufrufen zurück.

So eine ähnliche Idee hatte ich auch schon

Code: Alles auswählen

UseSQLiteDatabase(GetcurrentDirectory() + "sqlcipher.dll")
Hat aber auch nicht funktioniert.
Habs mit PB 5.73 und PB 6.02 probiert.

Edit:
Bild
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
TroaX
Beiträge: 684
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: Problemchen mit sqlcipher.dll

Beitrag von TroaX »

Hmmm Hast du für die Tests auf den anderen Systemen eine extra Executable erstellt oder hast du die temporäre Executable aus dem IDE-Run verwendet, um sie zu testen?
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Problemchen mit sqlcipher.dll

Beitrag von Kiffi »

Wo hast Du denn diese sqlcipher.dll her?

Eins noch (auch wenn es Dein Problem nicht löst):

GetPathPart(ProgramFilename()) liefert Dir immer und zuverlässig den Pfad zurück, in dem die EXE liegt.

GetCurrentDirectory() liefert Dir den Pfad zurück, von dem aus Du Deine Exe ausführst.
a²+b²=mc²
MenschMarkus
Beiträge: 227
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: Problemchen mit sqlcipher.dll

Beitrag von MenschMarkus »

Hmmm Hast du für die Tests auf den anderen Systemen eine extra Executable erstellt oder hast du die temporäre Executable aus dem IDE-Run verwendet, um sie zu testen?
Das war die PureBasic_Compilation0.exe weil diese die DEBUG Console im Hintergrund mit führt. Aber die erzeugte EXE verhält sich genauso, nur ohne DEBUG Console.
Wo hast Du denn diese sqlcipher.dll her?
Ich habe den SQLiteBrowser von https://sqlitebrowser.org herunter geladen. Dort gibt es auch eine Cipher Variante. Da wird die sqlcipher.dll mit geliefert. Auf dem Entwicklungsrechner funktioniert es problemlos.
GetPathPart(ProgramFilename()) liefert Dir immer und zuverlässig den Pfad zurück, in dem die EXE liegt.
Gut zu wissen. :allright:
GetCurrentDirectory() liefert Dir den Pfad zurück, von dem aus Du Deine Exe ausführst.
Reicht das nicht, dass der Pfad mit der DLL bei Programmstart bekannt ist?
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Problemchen mit sqlcipher.dll

Beitrag von Kiffi »

Gerade ausprobiert.

Mit der x64-Version von PB funktioniert es problemlos. Mit der x86er Version erhalte ich die von Dir genannte Fehlermeldung:
UseODBCDatabase(), UseSQLiteDatabase() bzw. UsePostgreSQLDatabase() muss vor dem Verwenden von Datenbank-Befehlen aufgerufen werden.
// Anders gesagt: Mit PB64 kannst Du nur die 64bit-Version der sqlcipher.dll laufen lassen.
// Die 32bit-Version der sqlcipher.dll habe ich mit der PB86-Version noch nicht zum Laufen bekommen.
a²+b²=mc²
MenschMarkus
Beiträge: 227
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: Problemchen mit sqlcipher.dll

Beitrag von MenschMarkus »

Wie immer,
Das Problem sitzt vor dem Computer
Das wars...
Danke dafür

Edit:
zu früh gefreut.
Ich hatte ein UseSQLiteDatabase() ohne Parameter vorab eingesetzt.
Nachdem ich das wieder heraus gelöscht hatte, mir erneut den x64 SQLite Browser herunter geladen hatte im die DLL zu erhalten ging es wieder nicht.
Irgendwie frustet mich das gerade
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Problemchen mit sqlcipher.dll

Beitrag von Kiffi »

In der sqlcipher.dll sehe ich noch einen Verweis auf die libcrypto-1_1.dll bzw. libcrypto-1_1-x64.dll (und evtl. noch andere)

Ich vermute, dass auf Deinem Entwicklungsrechner alle benötigten DLLs über PATH in den Environment-Variablen erreichbar sind.

Und auf dem Drittrechner nicht.
a²+b²=mc²
MenschMarkus
Beiträge: 227
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: Problemchen mit sqlcipher.dll

Beitrag von MenschMarkus »

In der sqlcipher.dll sehe ich noch einen Verweis auf die libcrypto-1_1.dll bzw. libcrypto-1_1-x64.dll (und evtl. noch andere)
OK, die libcrypto-1_1-x64.dll hat Abhilfe geschaffen. Danke dafür.

Nur wo hast Du den Verweis darauf gefunden ??
Ich habe mir die LibraryFunctionsnames() aus der sqlcipher.dll angesehen aber nichts diesbezüglich gefunden.

Edit:
OK, die libcrypto-1_1-x64.dll hat Abhilfe geschaffen.
Leider doch nicht. Dateien auf ein neues System kopiert, wieder Debugger Meldung UseSQLiteDatabase() muss erst aufgerufen werden.
Kiffi, kannst Du bitte mal die fertig compilierte Version auf einen dritten Rechner kopieren und dort testen?
Danke schon mal dafür.
Wissen schadet nur dem, der es nicht hat !
Antworten