Seite 1 von 2

[gelöst] Problemchen mit sqlcipher.dll

Verfasst: 03.08.2023 16:10
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.

Re: Problemchen mit sqlcipher.dll

Verfasst: 03.08.2023 16:29
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")

Re: Problemchen mit sqlcipher.dll

Verfasst: 03.08.2023 16:47
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

Re: Problemchen mit sqlcipher.dll

Verfasst: 03.08.2023 17:24
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?

Re: Problemchen mit sqlcipher.dll

Verfasst: 03.08.2023 17:51
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.

Re: Problemchen mit sqlcipher.dll

Verfasst: 03.08.2023 18:34
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?

Re: Problemchen mit sqlcipher.dll

Verfasst: 03.08.2023 18:57
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.

Re: Problemchen mit sqlcipher.dll

Verfasst: 03.08.2023 20:57
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

Re: Problemchen mit sqlcipher.dll

Verfasst: 03.08.2023 22:43
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.

Re: Problemchen mit sqlcipher.dll

Verfasst: 04.08.2023 08:31
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.