Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Création d'une variable string à partir d'une DLL Jeu 20 Avr 2017 - 13:10 | |
| J'aimerais dépasser une des limites (contraignantes) de l'interface entre Panoramic et DLL. J'aimerais pouvoir créer une variable de type chaîne de caractères, à partir d'une fonction DLL. Je sais très bien que je ne peux pas avoir accès au mécanisme de gestion de la table de symboles de Panoramic. Suite au EDIT du 7/5/2017, je mais la suite en spoiler, car je viens de proposer une solution qui, techniquement, est sûrement plus directe à implémenter. - Spoiler:
Ce que j'aimerais, ce serait d'avoir accès à une procedure du genre CallBack, mise à disposition par Panoramic. En appelant cette procédure, je lui passerais l'adresse d'une structure contenant les informations suivantes: - Code:
-
1 mot de 32 bits contenant la taille de la structure en octets (soit 16) 1 mot de 32 bits contenant la longueur en octets de la chaîne à créer 1 mot de 32 bits contenant un l'adresse d'une chaîne de caractères contenant le nom de la variable à créer 1 mot de 32 bits recevant la valeur de adr(...) Cette procédure créerait la variable Panoramic dont le nom est pointé par le troisième mot de la structure, en allouant un nopbre d'espaces selon la valeur du deuxième mot de la strcture. Ceci devrait simuler la commande - Code:
-
nouveau$ = string$(longueur%," ") La procédure retournerait la valeur de adr(nouveau$) dans le quatrième mot de la structure. D'ailleurs, si cette variable existe déjà, cette procédure devrait remplacer la variable existante par la nouvelle, exactement comme le ferait la commande ci-dessus. Ceci permettrait d'aller beaucoup plus loin dans l'utilisation conviviale de DLLs écrites par nous (évidemment sans incidence pour l'utilisation des DLLs externes comme celles de Windows). Pour donner l'adresse de cette procédure, je sais bien qu'il n'y a pas de mécanisme simple et automatique. Mais je propose qu'un message WM_USER+3001 envoyé à la form 0 pourrait retourner cette adresse de la manière suivante: - Citation :
- var
aCallBackprocedure: integer; begin ... SendMessage(MainFormHandle,WM_USER+3001,0,@aCallBackprocedure) Ceci permettrait de faire cette demande une fois, au chargement del a DLL, et de garder cette valeur dans une variable globale accessible à tout moment. EDIT 07/05/2017Une autre méthode pourrait être l'envoi d'un message WM_USER+3001 par SendMessage, avec l'adresse d'une structure telle que décrite ci-dessus. Et on recevrait en retour la valeur de adr(NouvelleChaîne$). Ainsi, dans la DLL, on pourrait coder ceci: - Code:
-
Type TCreateString = Record BlockSize: integer; // 1 mot de 32 bits contenant la taille de la structure en octets (soit 16) Length: integer; // 1 mot de 32 bits contenant la longueur en octets de la chaîne à créer Name: PString; // 1 mot de 32 bits contenant un l'adresse d'une chaîne de caractères contenant le nom de la variable à créer end; ... var RCreateString: TCreateString; nom: string; aNom: PString; ... Nom := "MaNouvelleChaine$" with RCreateString do begin BlockSize = 16; Length := Length(nom); Name := nom; end; aNom := SendMessage(MainFormHandle,WM_USER+3001,0,integer(@RCreateString)) if aNom<>nil then begin // ici, on peut copier les données dans la zone pointée par aNom end;
Ainsi, en extrapolant, ce message WM_USER+3001 pourrait devenir une interface bi-directionnelle entre Panoramic et une DLL. Dans ma proposition, LParam contient l'adresse du bloc de paramètres pour la demande de création d'une variable de type string. WParam est zéro. Mais on pourrait imaginer WParam étant un "code action", ou chaque valeur déclencherait une action spécifique dans Panoramic, et dans ce cas, 0 signifierait "création d'une variable de type string". | |
|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Création d'une variable string à partir d'une DLL Dim 7 Mai 2017 - 13:36 | |
| Juste un petit message pour dire que j'ai remanié ma suggestion ci-dessus. | |
|