limiter: if SRV%=0 then return limit% = val(text$(22)) res% = dll_call2("WebServerLimitClients",SRV%,limit%) message "La limite précédente était "+str$(res%) return
user_event: if bin_and(user_event_WParam,hex("FF000000"))=hex("14000000") event_code% = bin_and(user_event_WParam,hex("00FF0000"))/65536 select event_code% case 1 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Connexion client acceptée" case 2 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Nouveau client connecté" clear 17 res% = dll_call2("WebServerGetClients",SRV%,handle(17)) case 3 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Client déconnecté" clear 17 res% = dll_call2("WebServerGetClients",SRV%,handle(17)) case 4 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Demande à Panoramic" socket% = user_event_lparam commande$ = text$(13) s$ = "Désolé, je ne comprends pas..."+chr$(13)+chr$(10)+"Tapez Panoramic,?" ' *** traitement spécifique des commandes if commande$="Quel est ton nom ?" s$ = "Je m'appelle WinServer" end_if if commande$="Quel est ta date de naissance ?" s$ = "Je suis né le 29 Juillet 2021" end_if if commande$="Quel est ton créateur ?" s$ = "J'ai été créé par Klaus" end_if if commande$="?" s$ = "Je comprends les commandes suivantes:"+chr$(13)+chr$(10) s$ = s$ + "Quel est ton nom ?"+chr$(13)+chr$(10) s$ = s$ + "Quel est ta date de naissance ?"+chr$(13)+chr$(10) s$ = s$ + "Quel est ton créateur ?"+chr$(13)+chr$(10) end_if ' *** fin du traitement spécifique des commandes res% = dll_call3("WebServerReplyToClient",SRV%,socket%,adr(s$)) case 5 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Serveur à l'écoute" clear 17 res% = dll_call2("WebServerGetClients",SRV%,handle(17)) case 6 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Client demande n fichier" case 7 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Erreur dans connexion client" end_select end_if return
JP06
Nombre de messages : 20 Age : 74 Date d'inscription : 01/01/2012
Nouveautés: - nouvelle fonction WebServerDisconnectClient
Modules modifiés: KGF.dll KGF.chm
La doc est à jour.
Cette fonction permet au serveur de déconnecter un client de façon autoritaire. Dan sle programme de démo adapté ci-après, le client à déconnecter est sélectionné dans la liste des clients connectés en cliquant sur une des lignes, puis en cliquant sur le bouton "Déconnecter". Le serveur demande une confirmation, et, en cas de réponse positive, le client est déconnecté. On voit qu'il disparaît de la liste des clients connectés dans le serveur, et la fenêtre du client concerné sigane également la déconnexion, alors que les autres clients restent connectés. La démo du client reste inchangée.
limiter: if SRV%=0 then return limit% = val(text$(22)) res% = dll_call2("WebServerLimitClients",SRV%,limit%) message "La limite précédente était "+str$(res%) return
deconnecter: index% = item_index(17) if index%<2 message "Aucun client n'est sélectionné" return end_if s$ = item_read$(17,index%) if message_confirmation_yes_no("Céconnecter "+s$+" ?")<>1 then return p% = instr_last(s$," ") s$ = Mid$(s$,p%+1,300) client% = val(s$) res% = dll_call2("WebServerDisconnectClient",SRV%,client%) return
user_event: if bin_and(user_event_WParam,hex("FF000000"))=hex("14000000") event_code% = bin_and(user_event_WParam,hex("00FF0000"))/65536 select event_code% case 1 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Connexion client acceptée" case 2 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Nouveau client connecté" clear 17 res% = dll_call2("WebServerGetClients",SRV%,handle(17)) case 3 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Client déconnecté" clear 17 res% = dll_call2("WebServerGetClients",SRV%,handle(17)) case 4 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Demande à Panoramic" socket% = user_event_lparam commande$ = text$(13) s$ = "Désolé, je ne comprends pas..."+chr$(13)+chr$(10)+"Tapez Panoramic,?" ' *** traitement spécifique des commandes if commande$="Quel est ton nom ?" s$ = "Je m'appelle WinServer" end_if if commande$="Quel est ta date de naissance ?" s$ = "Je suis né le 29 Juillet 2021" end_if if commande$="Quel est ton créateur ?" s$ = "J'ai été créé par Klaus" end_if if commande$="?" s$ = "Je comprends les commandes suivantes:"+chr$(13)+chr$(10) s$ = s$ + "Quel est ton nom ?"+chr$(13)+chr$(10) s$ = s$ + "Quel est ta date de naissance ?"+chr$(13)+chr$(10) s$ = s$ + "Quel est ton créateur ?"+chr$(13)+chr$(10) end_if ' *** fin du traitement spécifique des commandes res% = dll_call3("WebServerReplyToClient",SRV%,socket%,adr(s$)) case 5 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Serveur à l'écoute" clear 17 res% = dll_call2("WebServerGetClients",SRV%,handle(17)) case 6 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Client demande n fichier" case 7 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Erreur dans connexion client" end_select end_if return
Yannick aime ce message
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Je suis en train de le rendre un peu plus "sûr" pour un usage en réseau ouvert. En particulier, je lui ajoute l'option de login avec nom d'utilisateur et mot de passe. Le serveur de son côté gère un fichier des clients autorisés avec leurs noms et leurs mots de passe, et les clients pour leur part gèrent chacun des fichiers des serveurs connectables qui sont propres à chaque client, avec le host et le port de chaque serveur, ainsi que le nom de client à utiliser sur chacun de ces serveurs ainsi que le mot de passe à utiliser. Bien sûr, le choix reste au serveur autoriser la connexion libre ou d'exiger un login.
Evidemment, tous ces fichiers de listes de serveurs et de clients sont cryptés en ce qui concerne les noms des clients et les mots de passe. Il ne sert à rien de subtiliser un tel fichier - il ne pourra jamais être décrypté sur une autre macine. Et les noms des clients et leurs mots de passe ne sont jamais transmis en clair sur le réseau, mais uniquement de façon crypté lors de la procédure de login. Et même si ces messages sont interceptés, ils ne pourront pas être décryptés sur une autre machine.
La partie maintenance de ces fichiers est gérée en 100 % Panoramic, côté serveur et côté client. Par contre, le cryptage et le décryptage est fait par une fonction de la DLL. Cette dernière peut d'ailleurs être utlisée indépendemment du contexte client/serveur, dans d'autres programmes Panoramic.
Un autre point important: plusieurs serveurs différents peuvent cohabiter sur une même machine, à condition d'utiliser des ports différents. Une même machine peut également faire tourner plusieurs clients, tous connectés à un même serveur ou à des serveurs différents. Un même programme client peut également se connecter simultanément sur plusieurs serveurs différents, même si ces serveurs sont localisés sur des machines diférentes.
Bref, on peut parfaitement implémenter un réseau privé relié via internet ou réseau local, gérant des ressources partagées comme des bases de données, imprimantes, sauvegardes centralisées etc.
Le tout prend forme lentement, et j'aurai prochainement une permière version opérationnelle à présenter.
Yannick aime ce message
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Sujet: Re: KGF_dll - nouvelles versions Ven 22 Oct 2021 - 0:12
Rapport d'étape: Je finalise en ce moment les composants WebServer et WebClient avec sécurisation, login,, liste de comptes autorisés et cryptage. Il y a encore un peu de travail mais ça progresse bien.
En attendant, j'ai finalisé la première version d'une intégration de la base de données SQLite3 dans KGF.dll. Je suis en train de rédiger la documentation ce qui est toujours un gros travail. L'idée est d'utiliser cette base à partir de WebServer et la rendre accessible à tous les programmes Panoramic, même distants via internet, à l'aide du composant WebClient. J'en avais donc besoin prioritairement pour finaliser les tests du système client/serveur.
Voici en avant-première la page d'accueil de l'aide des fonctions SQLite3:
Spoiler:
English
Les fonctions de cette section gèrent la gestion d'un objet SQLite. Un programme de démo complet de SQLite se trouve ici.
L'objet SQLite est en réalité une enveloppe (un wrapper) autour de SQLite3.dll version 3.6.7. Certes, ceci est une ancienne version, mais elle est parfaitement opérationnelle et ne prend pas beaucoup de place. Et comme elle n'est pas forcément présente sur tous les systèmes, elle est maintenant embarquée dans KGF.dll et une fonction spécifique permet de l'extraire et de la placer dans le dossier du programme EXE appelant étant ainsi facilement disponible. Une autre fonction permet bien sûr de l'enlever dès qu'elle ne sera plus utilisée.
SQLite3 est une base de donnée de type SQLcontenue dans un seul fichier et basée sur des tables contenant des enregistrements composés de champs. Tous les enregistrements d'une même table ont la même structure, mais chaque table a sa propre structure. Un ou plusieurs de ces champs peuvent servir de clé d'accès constituant ainsi un index dans le fichier.
Limitations: Le nombre de champs d'un enregistrement ou d'une clé, le nombre de tables et le nombre d'indexes ne sont pas limités. Un programme Panoramic peut gérer simultanément plusieurs bases de données SQLite3. Il n'y a pas de limite de principe. Bien entendu, selon la configuration matérielle de chaque système, certaines limites imposées par le matériel (taille mémoire, performance de l'unité centrale et du disque, nombre de programmes en cours simultanément, ...) peuvent conduire à des dégradations de performance et même des manques de ressources (mémoire en particulier), mais ce ne sont pas des limitations structurelles.
Note importante: SQLite3 a un nombre impressionnant de fonctions. La présente implémentation donne accès à un choix restreint parmi elles, mais elles sont suffisantes pour un usage de base (enregistrement, recherche, lecture). Mais cette sélection est appelée à augmenter rapidement dans un proche avenir.
SQLite3 est conçu et sécurisé pour un usage multi-utilisateur, avec les blocages nécessaires. Elle dispose également d'un mode de gestion de transactions permettant de défaire des actions partiellement complétée ou erronées sans perte de données. Ceci est vrai de façon automatique pour chaque action individuelle, mais des fonctions dédiées permettent de créer un groupe d'action qui sont soit intégralement validées soit intégralement annulées.
Principe général de fonctionnement: Mise à part les quelques fonctions de gestion globale, l'essentiel du travail avec une base de données SQLite3 se fait via des requêtes SQL. Donc, les huit fonctions gérant les requêtes SQL suffisent largement pour effectuer tous les travaux courants dans une base de données SQLite.
L'exécution d'une commande SQL requiert trois phases distinctes: - compilation de la requête - exécution d'une étape de la requête (phase éventuellement répétée selon les besoins) - clôture de la requête
Pour des requêtes simples, un seul appel d'une fonction spécifique permet d'effectuer ces trois phases l'une après l'autre sans autre intervention. Cependant, des requêtes plus compliquées peuvent retourner des collections de résultat, comme des requêtes SELECT par exemple. Dans ce cas, par d'autres fonctions, on compile séparément la requête, puis, ligne par ligne pour le résultat retournée, on va chercher une ligne et on va la traiter, jusqu'à épuisement des résultats retournés. Une autre fonction va finalement clôturer la requête et libérer les résultats.
Licence: La version intégrée deSQLite3 3.6.7 est entièrement gratuite pour tous usages. Les fonctions présentées dans cette section sont basées sue un wrapper de Brice Mestressat publié le 22 Janvier 2009 qui est entièrement libre de droits pour tous usages. Contact: brice.mestressat@laposte.net ou par le site https://mestressat.developpez.com/
Et la liste des fonctions actuellement réalisées:
Spoiler:
Je publierai ces fonctioins dès que la doc sera finie.
Dernière édition par Klaus le Ven 22 Oct 2021 - 10:37, édité 1 fois
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
Sujet: Re: KGF_dll - nouvelles versions Ven 22 Oct 2021 - 7:21
Bonjour Klaus, Je vois que tu ne perds pas ton temps. Sacré travail que tu fais là !
Mais dis moi quel est l'intérêt d'embarquer la dll QLite3 dans KGF.dll ? Pourquoi ne pas l'utiliser directement dans Panoramic comme les dll Windows.
Je suis très curieux de voir ce que l'on peut faire avec tout cela... A bientôt pour la suite et bon courage Klaus.
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Sujet: Re: KGF_dll - nouvelles versions Ven 22 Oct 2021 - 10:03
Citation :
Mais dis moi quel est l'intérêt d'embarquer la dll QLite3 dans KGF.dll ? Pourquoi ne pas l'utiliser directement dans Panoramic comme les dll Windows.
La réponse est simple. SQLite3.dll n'est pas nativement présent dans les systèmes Windows. Il faudrait donc la télécharger séparément et l'installer dans System32\... ou similaire.
Or, de multiples versions de SQLite existent, et on aurait vide des conflits de compatibilité.J'ai donc choisi une version "ancienne" (2009) pour laquelle Brice Mestressat a créé un adapteur Delphi le 22 Janvier 2009. J'ai donc simplement téléchargé la version SQLite3 qui va avec et je l'ai iintégrée dans KGF.dll afin d'éviter des conflits de version. Par ailleurs, le fait d'intégrer cette DLL dans KGF.dll rend son utilisation parfaitement transparente pour le programmeur Panoramic puisque KGF.dll se charge d'extraire et d'installer SQLite3.dll si elle est requise et de l'effacer après, automatiquement.
Certes, cette version de SQLite3 est ancienne. Mais elle est totalement gratuite quelqu'en soit l'usage, et parfaitement opérationnelle. Il y a bien des versions plus récentes, mais elles sont payantes, avec certes une version gratuite pour usage personnel, mais pas pour usage public. Ceci les rend inutilsables dans le cadre de KGF.dll que he publie, librement et gratuirement, pour tous usages. Cependant, les fonctions accessibles avec la version 3.6.7 de SQLite3 sont largement assez complètes et puissantes, même pour des utilisations professionnelles.
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
Sujet: Re: KGF_dll - nouvelles versions Ven 22 Oct 2021 - 13:27
Merci pour ta réponse Klaus.
Et y a t il beaucoup de fonctions sur SQLite3.dll et comptes tu toutes les intégrer à KGF.dll ? Car j'imagine que c'est un sacré travail...
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Sujet: Re: KGF_dll - nouvelles versions Ven 22 Oct 2021 - 13:53
Voici les fonctions de SQLite3.dll rendues accessibles par le wrapper que j'utilise:
//Obtain Aggregate Function Context function sqlite3_aggregate_context(sqlite3_context: Pointer; nBytes: Integer): Pointer; cdecl; external 'sqlite3.dll'; //Automatically Load An Extensions function sqlite3_auto_extension(xEntryPoint: Pointer): Integer; cdecl; external 'sqlite3.dll'; //Binding Values To Prepared Statements function sqlite3_bind_blob(sqlite3_stmt: pointer; param: integer; blob: pointer; size: integer; freeproc: integer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_bind_double(sqlite3_stmt: pointer; param: integer; value: double): integer; cdecl; external 'sqlite3.dll'; function sqlite3_bind_int(sqlite3_stmt: pointer; param: integer; value: integer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_bind_int64(stmt: pointer; param: integer; value: int64): integer; cdecl; external 'sqlite3.dll'; function sqlite3_bind_null(sqlite3_stmt: pointer; param: integer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_bind_text(sqlite3_stmt: pointer; param: integer; text: PChar; size: integer; freeproc: integer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_bind_text16(sqlite3_stmt: pointer; param: integer; text: Pointer; size: integer; freeproc: pointer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_bind_value(sqlite3_stmt: pointer; param: integer; sqlite3_value: pointer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_bind_zeroblob(sqlite3_stmt: pointer; param: integer; value: integer): integer; cdecl; external 'sqlite3.dll'; //Number Of SQL Parameters function sqlite3_bind_parameter_count(sqlite3_stmt: pointer): integer; cdecl; external 'sqlite3.dll'; //Index Of A Parameter With A Given Name function sqlite3_bind_parameter_index(sqlite3_stmt: pointer;zName:PChar): integer; cdecl; external 'sqlite3.dll'; //Name Of A Host Parameter function sqlite3_bind_parameter_name(sqlite3_stmt: pointer; param: integer): PChar; cdecl; external 'sqlite3.dll'; //BLOB function sqlite3_blob_bytes(sqlite3_blob: pointer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_blob_close(sqlite3_blob: pointer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_blob_open(sqlite3: pointer;zDb,zTable,zColumn: PChar;iRow: int64;flags: integer;sqlite3_blob: Pointer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_blob_read(sqlite3_blob: pointer;z: pointer;n,iOffset: integer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_blob_write(sqlite3_blob: pointer;z: pointer;n,iOffset: integer): integer; cdecl; external 'sqlite3.dll'; //Register A Callback To Handle SQLITE_BUSY Errors procedure sqlite3_busy_handler(sqlite3: Pointer; CallbackPtr: Pointer; UD:pointer); cdecl; external 'sqlite3.dll'; procedure sqlite3_busy_timeout(sqlite3: Pointer;TimeOut:integer); cdecl; external 'sqlite3.dll'; //Count The Number Of Rows Modified function sqlite3_changes(sqlite3: pointer): integer; cdecl; external 'sqlite3.dll'; //Reset All Bindings On A Prepared Statement function sqlite3_clear_bindings(sqlite3_stmt: pointer): integer; cdecl; external 'sqlite3.dll'; //Closing A Database Connection function sqlite3_close(sqlite3: pointer): integer; cdecl; external 'sqlite3.dll'; //Collation Needed Callbacks function sqlite3_collation_needed(sqlite3: pointer;pCollNeededArg:pointer;CollationFunctionPtr: Pointer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_collation_needed16(sqlite3: pointer;pCollNeededArg:pointer;CollationFunctionPtr: Pointer): integer; cdecl; external 'sqlite3.dll'; //Result Values From A Query function sqlite3_column_blob(sqlite3_stmt: pointer; col: integer): pointer; cdecl; external 'sqlite3.dll'; function sqlite3_column_bytes(sqlite3_stmt: pointer; col: integer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_column_bytes16(sqlite3_stmt: pointer; col: integer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_column_double(sqlite3_stmt: pointer; col: integer): double; cdecl; external 'sqlite3.dll'; function sqlite3_column_int(sqlite3_stmt: pointer; col: integer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_column_int64(sqlite3_stmt: pointer; col: integer): Int64; cdecl; external 'sqlite3.dll'; function sqlite3_column_text(sqlite3_stmt: pointer; col: integer): pchar; cdecl; external 'sqlite3.dll'; function sqlite3_column_text16(sqlite3_stmt: pointer; col: integer): PWChar; cdecl; external 'sqlite3.dll'; function sqlite3_column_type(sqlite3_stmt: pointer; col: integer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_column_value(sqlite3_stmt: pointer; ColNum: integer): pchar; cdecl; external 'sqlite3.dll'; //Number Of Columns In A Result Set function sqlite3_column_count(sqlite3_stmt: pointer): integer; cdecl; external 'sqlite3.dll'; //Source Of Data In A Query Result function sqlite3_column_database_name(sqlite3_stmt: pointer; col: integer): pchar; cdecl; external 'sqlite3.dll'; function sqlite3_column_database_name16(sqlite3_stmt: pointer; col: integer): PWChar; cdecl; external 'sqlite3.dll'; function sqlite3_column_table_name(sqlite3_stmt: pointer; col: integer): pchar; cdecl; external 'sqlite3.dll'; function sqlite3_column_table_name16(sqlite3_stmt: pointer; col: integer): pointer; cdecl; external 'sqlite3.dll'; function sqlite3_column_origin_name(sqlite3_stmt: pointer; col: integer): pchar; cdecl; external 'sqlite3.dll'; function sqlite3_column_origin_name16(sqlite3_stmt: pointer; col: integer): pointer; cdecl; external 'sqlite3.dll'; //Declared Datatype Of A Query Result function sqlite3_column_decltype(sqlite3_stmt: pointer; col: integer): pchar; cdecl; external 'sqlite3.dll'; function sqlite3_column_decltype16(sqlite3_stmt: pointer; col: integer): PWChar; cdecl; external 'sqlite3.dll'; //Column Names In A Result Set function sqlite3_column_name(sqlite3_stmt: pointer; col: integer): pchar; cdecl; external 'sqlite3.dll'; function sqlite3_column_name16(sqlite3_stmt: pointer; col: integer): pointer; cdecl; external 'sqlite3.dll'; //Commit And Rollback Notification Callbacks function sqlite3_commit_hook(sqlite3: pointer; i: integer; p: pointer): pchar; cdecl; external 'sqlite3.dll'; function sqlite3_rollback_hook(sqlite3: pointer; v1,v2: pointer): pchar; cdecl; external 'sqlite3.dll'; //Determine If An SQL Statement Is Complete function sqlite3_complete(SQL:pchar): integer; cdecl; external 'sqlite3.dll'; function sqlite3_complete16(SQL:PWChar): integer; cdecl; external 'sqlite3.dll'; //Database Connection For Functions function sqlite3_context_db_handle(sqlite3_context:pointer): pointer; cdecl; external 'sqlite3.dll'; //Define New Collating Sequences function sqlite3_create_collation(sqlite3: Pointer; CollName: PChar; eTextRep: Integer; pCtx: Pointer; compareFuncPtr: Pointer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_create_collation_v2(sqlite3: Pointer; CollName: PWChar; eTextRep: Integer; pCtx: Pointer; compareFuncPtr: Pointer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_create_collation16(sqlite3:pointer;zName:PWChar;eTextRep: Integer; pCtx: Pointer; compareFuncPtr: Pointer): integer; cdecl; external 'sqlite3.dll'; //Create Or Redefine SQL Functions function sqlite3_create_function(sqlite3: pointer; zFunctionName: pchar; nArg: integer; eTextRep: Integer; pApp: pointer; xFunc: pointer; xStep: pointer; xFinal: pointer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_create_function16(sqlite3: pointer; zFunctionName: pwchar; nArg: integer; eTextRep: Integer; pApp: pointer; xFunc: pointer; xStep: pointer; xFinal: pointer): integer; cdecl; external 'sqlite3.dll'; //Number of columns in a result set function sqlite3_data_count(sqlite3_stmt:pointer): integer; cdecl; external 'sqlite3.dll'; //Find The Database Handle Of A Prepared Statement function sqlite3_db_handle(sqlite3_stmt:pointer): pointer; cdecl; external 'sqlite3.dll'; //Retrieve the mutex for a database connection function sqlite3_db_mutex(sqlite3:pointer): pointer; cdecl; external 'sqlite3.dll'; //Enable Or Disable Extension Loading function sqlite3_enable_load_extension(sqlite3:pointer;onoff:integer): integer; cdecl; external 'sqlite3.dll'; //Enable Or Disable Shared Pager Cache function sqlite3_enable_shared_cache(i:integer): integer; cdecl; external 'sqlite3.dll'; //Error Codes And Messages function sqlite3_errcode(sqlite3:pointer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_extended_errcode(sqlite3:pointer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_errmsg(sqlite3:pointer): pchar; cdecl; external 'sqlite3.dll'; function sqlite3_errmsg16(sqlite3:pointer): PWChar; cdecl; external 'sqlite3.dll'; //One-Step Query Execution Interface function sqlite3_exec(sqlite3: pointer; sql: pchar; callback: pointer; userdata: pchar; var errmsg: pchar): integer; cdecl; external 'sqlite3.dll'; //Enable Or Disable Extended Result Codes function sqlite3_extended_result_codes(sqlite3:pointer;onoff:integer): integer; cdecl; external 'sqlite3.dll'; //Low-Level Control Of Database Files function sqlite3_file_control(sqlite3:pointer;zDbName:pchar;op:integer;v:pointer): integer; cdecl; external 'sqlite3.dll'; //Destroy A Prepared Statement Object function sqlite3_finalize(sqlite3_stmt: pointer): integer; cdecl; external 'sqlite3.dll'; //Memory Allocation Subsystem function sqlite3_malloc(i: integer):pointer; cdecl; external 'sqlite3.dll'; function sqlite3_realloc(v:pointer;i: integer):pointer; cdecl; external 'sqlite3.dll'; procedure sqlite3_free(ptr: pchar); cdecl; external 'sqlite3.dll'; //Convenience Routines For Running Queries function sqlite3_get_table(sqlite3: pointer; sql: pchar; var result: PPCharArray; var RowCount: Cardinal; var ColCount: Cardinal; var errmsg: pchar): integer; cdecl; external 'sqlite3.dll'; procedure sqlite3_free_table(table: PPCharArray); cdecl; external 'sqlite3.dll'; //Test For Auto-Commit Mode function sqlite3_get_autocommit(sqlite3: pointer):integer; cdecl; external 'sqlite3.dll'; //Function Auxiliary Data function sqlite3_get_auxdata(sqlite3_context: pointer;N:integer):pointer; cdecl; external 'sqlite3.dll'; procedure sqlite3_set_auxdata(sqlite3_context: pointer;N:integer;v1,v2:pointer); cdecl; external 'sqlite3.dll'; //Initialize The SQLite Library function sqlite3_initialize(v:pointer):integer; cdecl; external 'sqlite3.dll'; function sqlite3_shutdown(v:pointer):integer; cdecl; external 'sqlite3.dll'; function sqlite3_os_init(v:pointer):integer; cdecl; external 'sqlite3.dll'; function sqlite3_os_end(v:pointer):integer; cdecl; external 'sqlite3.dll'; //Interrupt A Long-Running Query procedure sqlite3_interrupt(sqlite3: pointer); cdecl; external 'sqlite3.dll'; //Last Insert Rowid function sqlite3_last_insert_rowid(sqlite3: pointer): int64; cdecl; external 'sqlite3.dll'; //Run-Time Library Version Numbers function sqlite3_libversion:pchar; cdecl; external 'sqlite3.dll'; function sqlite3_libversion_number:integer; cdecl; external 'sqlite3.dll'; //Run-time Limits function sqlite3_limit(sqlite3:pointer;id,newVal:integer):integer; cdecl; external 'sqlite3.dll'; //Load An Extension function sqlite3_load_extension(sqlite3:pointer;zFile,zProc:pchar;pzErrMsg:PPCharArray):integer; cdecl; external 'sqlite3.dll'; //Memory Allocator Statistics function sqlite3_memory_used(v: pointer): int64; cdecl; external 'sqlite3.dll'; function sqlite3_memory_highwater(resetFlag: integer): int64; cdecl; external 'sqlite3.dll'; //Formatted String Printing Functions function sqlite3_mprintf(v: pchar): pchar; cdecl; external 'sqlite3.dll'; function sqlite3_vmprintf(v: pchar;valist:PPCharArray): pchar; cdecl; external 'sqlite3.dll'; function sqlite3_snprintf(i:integer;v1,v2: pchar): pchar; cdecl; external 'sqlite3.dll'; //Mutexes function sqlite3_mutex_alloc(i: integer): pointer; cdecl; external 'sqlite3.dll'; procedure sqlite3_mutex_free(sqlite3_mutex: pointer); cdecl; external 'sqlite3.dll'; procedure sqlite3_mutex_enter(sqlite3_mutex: pointer); cdecl; external 'sqlite3.dll'; function sqlite3_mutex_try(sqlite3_mutex: pointer): integer; cdecl; external 'sqlite3.dll'; procedure sqlite3_mutex_leave(sqlite3_mutex: pointer); cdecl; external 'sqlite3.dll'; //Mutex Verification Routines function sqlite3_mutex_held(sqlite3_mutex: pointer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_mutex_notheld(sqlite3_mutex: pointer): integer; cdecl; external 'sqlite3.dll'; //Find the next prepared statement function sqlite3_next_stmt(sqlite3,sqlite3_stmt: pointer): pointer; cdecl; external 'sqlite3.dll'; //Opening A New Database Connection function sqlite3_open(filename: pchar; var sqlite3: pointer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_open16(filename: pwchar; var sqlite3: pointer): integer; cdecl; external 'sqlite3.dll'; function sqlite3_open_v2(filename: pchar; var sqlite3: pointer;flags:integer;zVfs:pointer): integer; cdecl; external 'sqlite3.dll'; //Compiling An SQL Statement function sqlite3_prepare(sqlite3:pointer;sql:pchar;nBytes:integer;var stmt:pointer;var ztail:pchar):integer; cdecl; external 'sqlite3.dll'; function sqlite3_prepare_v2(sqlite3:pointer;sql:pchar;nBytes:integer;var stmt:pointer;var ztail:pchar):integer; cdecl; external 'sqlite3.dll'; function sqlite3_prepare16(sqlite3:pointer;sql:pwchar;nBytes:integer;var stmt:pointer;var ztail:pchar):integer; cdecl; external 'sqlite3.dll'; function sqlite3_prepare16_v2(sqlite3:pointer;sql:pwchar;nBytes:integer;var stmt:pointer;var ztail:pchar):integer; cdecl; external 'sqlite3.dll'; //Query Progress Callbacks function sqlite3_progress_handler(sqlite3:pointer;iMax:integer;pCallBack:pointer;p:pointer): integer; cdecl; external 'sqlite3.dll'; //Pseudo-Random Number Generator procedure sqlite3_randomness(n:integer;p:pointer); cdecl; external 'sqlite3.dll'; //Attempt To Free Heap Memory function sqlite3_release_memory(imem:integer): integer; cdecl; external 'sqlite3.dll'; //Reset A Prepared Statement Object function sqlite3_reset(sqlite3_stmt: pointer): integer; cdecl; external 'sqlite3.dll'; //Reset Automatic Extension Loading procedure sqlite3_reset_auto_extension(ext: pointer); cdecl; external 'sqlite3.dll'; //Setting The Result Of An SQL Function function sqlite3_result_blob(sqlite3_context:pointer;Buf:pointer;LengthBuf:integer;RetunrMod:integer):integer;cdecl; external 'sqlite3.dll'; function sqlite3_result_double(sqlite3_context:pointer;result:double):integer;cdecl; external 'sqlite3.dll'; function sqlite3_result_error(sqlite3_context:pointer;msg:pchar;result:integer):integer;cdecl; external 'sqlite3.dll'; function sqlite3_result_error16(sqlite3_context:pointer;msg:pwchar;result:integer):integer;cdecl; external 'sqlite3.dll'; function sqlite3_result_error_toobig(sqlite3_context:pointer):integer;cdecl; external 'sqlite3.dll'; function sqlite3_result_error_nomem(sqlite3_context:pointer):integer;cdecl; external 'sqlite3.dll'; function sqlite3_result_error_code(sqlite3_context:pointer;result:integer):integer;cdecl; external 'sqlite3.dll'; function sqlite3_result_int(sqlite3_context:pointer;result:integer):integer;cdecl; external 'sqlite3.dll'; function sqlite3_result_int64(sqlite3_context:pointer;result:int64):integer;cdecl; external 'sqlite3.dll'; function sqlite3_result_null(sqlite3_context:pointer):integer;cdecl; external 'sqlite3.dll'; function sqlite3_result_text(sqlite3_context:pointer;Buf:pointer;LengthBuf:integer;RetunrMod:integer):integer;cdecl; external 'sqlite3.dll'; function sqlite3_result_text16(sqlite3_context:pointer;Buf:pwchar;LengthBuf:integer;RetunrMod:integer):integer;cdecl; external 'sqlite3.dll'; function sqlite3_result_text16le(sqlite3_context:pointer;Buf:pwchar;LengthBuf:integer;RetunrMod:integer):integer;cdecl; external 'sqlite3.dll'; function sqlite3_result_text16be(sqlite3_context:pointer;Buf:pwchar;LengthBuf:integer;RetunrMod:integer):integer;cdecl; external 'sqlite3.dll'; function sqlite3_result_value(sqlite3_context,sqlite3_value:pointer):integer;cdecl; external 'sqlite3.dll'; function sqlite3_result_zeroblob(sqlite3_context:pointer;n:integer):integer;cdecl; external 'sqlite3.dll'; //Compile-Time Authorization Callbacks function sqlite3_set_authorizer(sqlite3:pointer;n:integer;pUserData:pointer):integer;cdecl; external 'sqlite3.dll'; //Suspend Execution For A Short Time function sqlite3_sleep(mstime:integer):integer;cdecl; external 'sqlite3.dll'; //Impose A Limit On Heap Size procedure sqlite3_soft_heap_limit(i:integer); cdecl; external 'sqlite3.dll'; //Retrieving Statement SQL function sqlite3_sql(sqlite3_stmt:pointer):pchar;cdecl; external 'sqlite3.dll'; //Evaluate An SQL Statement function sqlite3_step(sqlite3_stmt: pointer): integer; cdecl; external 'sqlite3.dll'; //Extract Metadata About A Column Of A Table function sqlite3_table_column_metadata(sqlite3:pointer;zDbName:pchar;zTableName:pchar;zColumnName:pchar;pzDataType,pzCollSeq:ppchar;pNotNull,pPrimaryKey,pAutoinc:boolean): integer; cdecl; external 'sqlite3.dll'; //Test To See If The Library Is Threadsafe function sqlite3_threadsafe(v: Pointer): Integer; cdecl; external 'sqlite3.dll'; //Total Number Of Rows Modified function sqlite3_total_changes(sqlite3:Pointer): Integer; cdecl; external 'sqlite3.dll'; //Data Change Notification Callbacks function sqlite3_update_hook(sqlite3:Pointer;p:pointer): Integer; cdecl; external 'sqlite3.dll'; //User Data For Functions function sqlite3_user_data(sqlite3_context:Pointer): pointer; cdecl; external 'sqlite3.dll'; //Obtaining SQL Function Parameter Values function sqlite3_value_blob(sqlite3_value: Pointer): pointer; cdecl; external 'sqlite3.dll'; function sqlite3_value_bytes(sqlite3_value: Pointer): Integer; cdecl; external 'sqlite3.dll'; function sqlite3_value_bytes16(sqlite3_value: Pointer): Integer; cdecl; external 'sqlite3.dll'; function sqlite3_value_double(sqlite3_value: Pointer): double; cdecl; external 'sqlite3.dll'; function sqlite3_value_int(sqlite3_value: Pointer): Integer; cdecl; external 'sqlite3.dll'; function sqlite3_value_int64(sqlite3_value: Pointer): int64; cdecl; external 'sqlite3.dll'; function sqlite3_value_text(sqlite3_value: Pointer): PAnsiChar; cdecl; external 'sqlite3.dll'; function sqlite3_value_text16(sqlite3_value: Pointer): PWideChar; cdecl; external 'sqlite3.dll'; function sqlite3_value_text16le(sqlite3_value: Pointer): PWideChar; cdecl; external 'sqlite3.dll'; function sqlite3_value_text16be(sqlite3_value: Pointer): PWideChar; cdecl; external 'sqlite3.dll'; function sqlite3_value_type(sqlite3_value: Pointer): Integer; cdecl; external 'sqlite3.dll'; function sqlite3_value_numeric_type(sqlite3_value: Pointer): Integer; cdecl; external 'sqlite3.dll'; //Virtual File System Objects function sqlite3_vfs_find(zVfsName: pchar): Integer; cdecl; external 'sqlite3.dll'; function sqlite3_vfs_register(sqlite3_vfs:pointer;makeDflt:integer): Integer; cdecl; external 'sqlite3.dll'; function sqlite3_vfs_unregister(sqlite3_vfs:pointer): Integer; cdecl; external 'sqlite3.dll';
Comme du vois, il y en a beaucoup. Je suis loin d'avoir tout compris. Néanmoins, avec les quelques fonctions que j'ai implémentées à l'heure actuelle, je peux déjà: - créer une nouvelle base de données vide - ouvrir une base de données existante - connaître le nombre et le nom des tables dans une base de données - connaître le nombre et les noms des champs dans une table - exécuter n'importe quelle requête SQL
Et ce dernier point est crucial, car il permet, entre autres: - créer une nouvelle table - ajouter un enregistrement dans une table en donnant les contenus des champs - effectuer des recherches dans une table selon un critère quelconque et récupérer le ou les résultats contenus dans le résultat - récupérer le contenu d'un champ d'un enregistrement résultat d'une recherche
Ce sont les capacités actuellement utilisées dans mon programme de démo. Mais même dans l'implémetation actuelle, cela va beaucoup plus loin. Les requêtes SQL permettent de supprimer un ou plusieurs enregistrements résultats d'une recherche, de modifier le contenu des champs d'enregistrements résultats d'une recherche, de suprimer une table entièrement, etc. Et tout ceci en mettant à jour automatiquement les indexes si le contenu des champs concernés a change.
Beaucoup de choses sont possibles, même déjà avec les quelques fonctions SQLite3 que j'ai rendues accessibles. Et vue l'architecture que j'ai créée, on pourra aller beaucoup plus loin très facilement. Une fonctioin existant dans SQLite3.dll nécessaire à un Panoramicien et non accssible via KGF.dll ? Rien de plus simple: l'ajout se fait en un quart d'heure, la documentation en 1 heure, la génération de la nouvelle documentation prend 2 heures, puis et la distribution de la nouvelle DLL et de la documentation en format CHM et en ligne se fait en 2 heures. Bref, il faut 1 journée. En fait, tout se joue au niveau du langage SQL. C'est un véritable langage de sriptage, et je donnerai, lors de la publication de la nouvelle version, des liens vers une documentation en ligne sérieuse pour ce langage.
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
Sujet: Re: KGF_dll - nouvelles versions Ven 22 Oct 2021 - 14:52
Waouh effectivement c'est du lourd !!!
Ok. Merci pour toutes ces infos Klaus.
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
Sujet: Re: KGF_dll - nouvelles versions Sam 23 Oct 2021 - 9:09
Si cela intéresse quelqu'un, je pourrais essayer de faire un ADDON pour FBCroco.
Ouf_ca_passe aime ce message
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Sujet: Re: KGF_dll - nouvelles versions Dim 24 Oct 2021 - 12:28
KGF.dll V9.56 du 24/10/2021
Nouveautés: - nouvel objet SQLite3
Modules modifiés: KGF.dll KGF.chm
La doc est à jour.
Ceci est une véritable base de données de type SQL organisée en tables ayant des lignes composées de champs, multi-utilisateur, avec des indexes multibles, gestion de transactions etc. Pour cette première implémentation, une sélection restreints parmi les multiples fonctions de cette base de données est rendue accessible via cet objet. Mais elle permet déjà d'exloiter les fonctions essentielles. Cette sélection s'enrichira au fur et à mesure.
Ci-après, un programme de démo montre l'usage de cet objet. L'interface visuel se présente ainsi:
Le programme est géré par des menus. Il faut faire, dans l'ordre:
- fichier \ Ìnitialize SQLite3 ==> sqlite3.dll est extrait de KGF.dll et placé dans le dossier du EXE Panoramic le numéro de version de sqlite3.dll est affiché - fichier \ OPen SQLite3 ==> une base de données TestTable.db vide est créé. - sample scripts SQL \ Create sample table ==> une requête SQL créant une table de démo est placée dans le mémo du bas - Execute scripts SQL \ Execute script from memo ==> la requête affichée dans le mémo est exécutée. Une tablle TestTable est créée avec un format spécifiant 5 champs. - Execute scripts SQL \ Fill data base ==> la base de données est chargée par un certain nombre d'enregistrements contenant des données aléatoires placer "%" dans le champ "critère" en haut à droite (sans les guillemets) - Execute scripts SQL \ Fill grid from database ==> remplir de GRID à droite par le contenu de la base placer "S%" dans le champ "critères" (sans les guillemets) et refaites l'opération ==> seules les lignes commençant par "S" s'afficheront - Execute scripts SQL \ Get table names in database ==> dans le mémo en haut à droite, on a la liste des tables (1 seule) Placer "TestTable" dans la zone "Critères" en haut à droite (sans les guillemets) - Execute scripts SQL \ Get column names in table 'critère' ==> la liste des champs de la table avec leurs caractéristiques s'affiche dans le mémo en haut
' récupérer le nombre de lignes de la réponse RowCount% = dll_call2("GetSQLite3RowCount",SQL%,adr(TestTable$)) item_add 1001," "+str$(rowcount%)+" Lignes dans table "+TestTable$ return
fill: if SQL%=0 message "No database open" return end_if xNbrRecords% = 10 : ' 500 min 1020,0 : max 1020,xNbrRecords% clear 1011 for x%=1 to xNbrRecords% Position 1020,x% ' construire la requête SQL sOtherID$ = str$(int(1 + Rnd(9))) sName$ = chr$(int(65+rnd(26)))+str$(x%) sNumber$ = rnd(1) p% = instr(sNumber$,",") if p%>0 then sNumber$ = left$(sNumber$,p%-1)+"."+mid$(sNumber$,p%+1,len(sNumber$)) sNotes$ = "Possibilité de stocker des données BLOB" sSQL$ = "INSERT INTO "+TestTable$+"(Name,OtherID,Number,Notes) VALUES (²"+sName$+"²,"+sOtherID$+","+sNumber$+",²"+sNotes$+"²);" item_add 1011,sSQL$ ' exécuter la requête SQL res% = dll_call2("ExecuteSQLite3Script",SQL%,adr(sSQL$)) if res%<0 item_add 1011,"Erreur dans requête SQL" return end_if next x% item_add 1011,"Database filled with "+str$(xNbrRecords%)+" records" Position 1020,0 return
fillgrid: if SQL%=0 message "No database open" return end_if ' récupérer le nombre de lignes de la réponse RowCount% = dll_call2("GetSQLite3RowCount",SQL%,adr(TestTable$)) if RowCount%<1 item_add 1011,"Table "+TestTable$+"manquante ou vide" return end_if grid_row 1034,RowCount%+1
' charger la table dans le gridRequête SQL sSQL$ = "SELECT * " sSQL$ = sSQL$ + "FROM "+testTable$ sSQL$ = sSQL$ + " WHERE (("+testTable$+".Name)" sSQL$ = sSQL$ + " Like ²"+text$(1031)+"²)" if text$(1033)<>"" sSQL$ = sSQL$ + " "+text$(1033)+";" else sSQL$ = sSQL$ + ";" end_if
' préparation de la requête: sélection des enregistrements de la table selon les critères res% = dll_call2("CompileSQLite3Script",SQL%,adr(sSQL$))
' Vider grid for i%=2 to RowCount%+1 for j%=1 to grid_column(1034) grid_write 1034,i%,j%,"" next j% next i%
' boucle d'affichage du résultat min 1020,0 : max 1020,5 : position 1020,0 for i%=1 to RowCount% position 1020,i% ' Remplissage grid par lecture de chacun des colonnes de chacun des enregistrements res% = dll_call1("GetSQLite3NextRow",SQL%) if res%<0 then exit_for for j%=1 to 5 res% = dll_call2("GetSQLite3CellText",SQL%,j%) grid_write 1034,i%+1,j%,text$(1001) : ' Ecriture dans la cellule correspondante next j% next i% res% = dll_call1("FinalizeSQLite3Request",SQL%) return
tables: if SQL%=0 message "No database open" return end_if res% = dll_call1("GetSQLite3TableNames",SQL%) item_add 1001,str$(res%)+" tables" return
columns: if SQL%=0 message "No database open" return end_if s$ = trim$(text$(1031)) if s$="" then s$ = TestTable$ res% = dll_call2("GetSQLite3ColumnNames",SQL%,adr(s$)) item_add 1001,str$(res%)+" colonnes dans table "+s$ return
JP06
Nombre de messages : 20 Age : 74 Date d'inscription : 01/01/2012
Sujet: KGF_dll - nouvelles versions Dim 24 Oct 2021 - 16:02
Bonjour Klaus J'ai téléchargé l'exemple avec Sqlite. J'ai un message d'erreur "Impossible de charger la DLL". J'utilise KGF dans d'autres applications, tout se passe bien. En substituant la nouvelle version a l'ancienne, il y a plantage... Je suis sous Windows 11, mais en ceci n'a probablement pas d'influence. Peux tu voir ce petit problème ? merci pour ton travail.
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Sujet: Re: KGF_dll - nouvelles versions Dim 24 Oct 2021 - 16:48
A que moment as-tu ce problème ? Lors du lancement du programme ? Lors de l'utilisation du menu "fichier \ Ìnitialize SQLite3" ?
Fais l'essai suivant: - génère le fichier EXE du programme de démo - place KGF.dll dans le même dossier - lance le fichier EXE par un double-clic dans l'explorateur
Est-ce que c'est le même problème ? A quel moment ? Peux-tu poster une capture écran ?
JP06
Nombre de messages : 20 Age : 74 Date d'inscription : 01/01/2012
Sujet: KGF_dll - nouvelles versions Dim 24 Oct 2021 - 17:05
Salut Klaus, J'ai généré l'exécutable, avec la DLL dans le même dossier, j'ai toujours le message (136) impossible to load dll line 62. Désolé je n'ai pas trouvé comment insérer une image.. Merci.
Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
Sujet: Re: KGF_dll - nouvelles versions Dim 24 Oct 2021 - 17:35
Bonjour à tous !
Juste un petit mot pour dire merci à Klaus et préciser que je n’ai pas rencontré de dysfonctionnement mon côté sous Windows 10.
Spoiler:
Spoiler:
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Sujet: Re: KGF_dll - nouvelles versions Dim 24 Oct 2021 - 17:43
Mersi à vous deux pour vos test.
L'indication décisive était le numéro de ligne de l'erreur. Elle se produit sur "DLL_ON "KGF.dll".
Conclusion: KGF.dll n'est pas dans le dossier où se trouve l'EXE.
Solution: copier KGF.dll dans le dossier où se trouve l'EXE, ou adapter le chemin dans la ligne 62 pour qu'il trouve KGF.dll.
Comme le dit la pub: "Autentica qualita ! Et voilà..." Désolé, je n'ai pas pu me retenir...
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
Sujet: Re: KGF_dll - nouvelles versions Dim 24 Oct 2021 - 21:15
Bonsoir Klaus et bonsoir à tous !
J'ai voulu moi aussi tester et j'ai le même problème que notre ami JP06 !
J'ai créer un dossier Base_SQL dans lequel j'ai téléchargé la dernière version de KGF. J'ai enregistrer le programme dans ce même dossier et j'ai même créé un EXEcutable des fois que...
Mais tout cela ne change rien... toujours le message en ligne 62 !
PS : Je suis en version Panoramic 0.9.29i9 et sous W10.
Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
Sujet: Re: KGF_dll - nouvelles versions Dim 24 Oct 2021 - 23:48
Salut Minibug !
De mon côté, toujours pas de problème. J’ai la version KGF 9.56 du 24/10/2021.
Spoiler:
J'ai également testé avec Panoramic_Editor v0.9.29i11, pas de problème.
Spoiler:
Je viens à nouveau de télécharger KGF.DLL : R.A.S. cela fonctionne toujours. Il n’y a pas eu de changement au niveau du fichier entre mon premier téléchargement et ce soir. Il est horodaté identiquement.
Spoiler:
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Mais tout cela ne change rien... toujours le message en ligne 62
Le problème vient certainement du fait que tu exécutes le programme directement à partir de l'éditeur. Or, l'EXE temporaire qu'il crée, il est placé dans un autre dossier que le fichier source qu'on croit exécuter. Et, logiquement, il ne trouve pas KGF.dll, ne peut pas trouver KGF.dll.
Solution simple, comme nous l'avons d'ailleurs toujours fait: modifier le source du programme de démo à la ligne 62 pour mettre le chemin complet vers l'emplacement de KGF.dll dans cette commande d'ouverture. Ca fait quand-même quelques années que nous connaissons ce problème, non ?
JP06
Nombre de messages : 20 Age : 74 Date d'inscription : 01/01/2012
Bonjour Klaus, L'exemple fonctionne bien. Il fallait juste télécharger la DLL sqlite version 3.6.0 et la mettre dans le dossier exemple. J'utilise ELIP en version 2.13 MAKE_EXE version 0.6.29i9 Merci pour ton travail et ta disponibilité.
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Il fallait juste télécharger la DLL sqlite version 3.6.0 et la mettre dans le dossier exemple.
Euh... ben non, en fait ! Deux remarques: 1. d'abord, la bonne version est SQLite 3.6.7. Même ci cette version est déjà ancienne, c'est celle qui va avec l'implémentation dans KGF.dll. LA versioin 3.6.0 est encore plus ancienne, et là, je ne sais pas si c'est entièrement compatible 2. Le présence ou non de sqlite3.dll ne joue aucun rôle jusqu'à la ligne 62. Cette dernière charge KGF.dll, pas sqlite3.dll. Une erreur "dll non trouvée" ne se rapporte donc qu'à KGF.dll, à rien d'autre. Puis, en ligne 66, on trouve:
Code:
res% = dll_call0("InitializeSQLite3")
C'est ici que sqlite3.dll version 3.6.7 est extraite de KGF.dll et placée dans le dossier où se trouve l'EXE qui est en train d'exécuter. C'est cette version de sqlite3.dll qu'il faut. Or, comme tu utilises ELIP avec Make.exe (excellent choix, d'ailleurs !), je ne sais pas où se trouve l'EXE généré par Make.exe. C'est là qu'il faut chercher sqlite3.dll et tu y trouveras certainement celle extraite de la DLL. La preuve: lorsque tu lances ce programme de démo, puis tu choisis le menu "File" puis "Initialize SQLite3", tu obtiens ceci: Tu vois que la version est 3006007. Avec SQLite3 version 3.6.0, tu verrais 3006000.
Je peux te paraître pédant, mais ces questions de version sont importantes. Sinon, la cohérence entre sqlite3.dll et mon implémentation des fonctions dans KGF.dll ne peut pas être garantie.
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
Je te confirme de mon coté que j'ai bien testé depuis un EXEcutable et non le fichier bas. Comme indiqué dans mon précédent message :
Citation :
J'ai enregistrer le programme dans ce même dossier et j'ai même créé un EXEcutable des fois que
Je ne suis pas un bleu ! Pour moi il y a un autre problème. Je n'ai pas le temps de regarder ce matin mais je m'y replongerai ce soir après le travail...
Bonne journée à tous !
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
J'utilise la dernière version de Panoramic, et j'exécute à partir de Panoramic_Editor. Un test montre que l'exécutable demon programme se trouve dans un dossier temporaire, et c'est là que sqlite3.dll est extrait:
Par contre, lors de la commande en ligne 62
Code:
dll_on "KGF.dll"
charge bien KGF.dll présente dans le dossier où se trouve le source du programme et non l'exécutable généré.
Je suis sous Windows 10 dernière version toutes mises à jour faites, et avec la version Panoramic:
Avec Panoramic_Editor, donc, il faut placer KGF.dll dans le dossier où est le code source du programme ou mettre le chemin vers KGF.dll dans la ligne 26. Le programme se chargera alors correctement. Puis, lors de l'initialisation de l'environnement SQLite3 (ligne 66), sqlite3.dll sera extraite dans le dossier où est place l'EXE généré qui est un sous-dossier temporaire de ..:_Appdata\Local\... .
Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
Après avoir testé sur différents PC, je constate que sur certains ordinateurs il est effectivement impossible de charger KGF.
Que ce soit : - Avec Panoramic_Editor ; - Un éditeur alternatif ; - En désactivant Windows Defender ; - En tapant le chemin d’accès à KGF au complet (C:\Users\Marc\Desktop\Dev\Panoramic\kgf.dll) ; - En recopiant KGF à partir d’un PC où cela fonctionne
Rien n’y fait ! Impossible de charger la DLL sur certains ordinateurs.