Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Problème en adressage de strings par ADR() ? Sam 19 Fév 2011 - 22:56 | |
| Pendant mes tests pour un problème avec mon WebBrowser, signalé par Ygeronimi, je suis tombé sur un comportement curieux. Je passe un string en paramètre de la manière suivante: En Panoramic: - Code:
-
dim x$, ax%, i%
x$ = "ma chaîne de caractères" ax% = adr(x$)
i% = dll_call1("MaFonction",ax%)
En Delphi, dans ma DLL, je reçois le string de la manière suivante: - Code:
-
function MaFonctionl(Chaine: pstring): integer; stdcall; export; var MaChaine: WideString; begin MaChaine := Chaine^; showmessage(MaChaine); Avec la version V09.21i1, je récupère bien ma chaîne, et elle est affichée par showmessage. Avec la version V09.31i3, je récupère une chaîne vide. Qu'est-ce qui a changé % La fonction adr() retourne une valeur non-nulle, mais visiblement, ce n'est plus un pointeur sur la partie data de la chaîne; ça pointe peut-être sur un zéro. Je précise que j'utilise le même source Panoramic pour tester dans les deux versions, et la même dll avec ma fonction Delphi. La seule différence, c'est l'éditeur. | |
|
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Problème en adressage de strings par ADR() ? Mar 22 Fév 2011 - 9:28 | |
| Bonjour Klaus,
Je viens juste d'installer la dernière version 0.9.21i3 et je n'ai pas ce problème avec mes DLL en FreeBASIC.
Je n'ai pas encore testé avec Delphi.
En FreeBASIC je passe le pointeur par référence (byref p as zstring ptr), comme l'avait conseillé D. J. Peters. Peut-être faut-il faire de même en Delphi (var p : pstring) ?
En revanche, je n'ai toujours pas trouvé comment retourner à Panoramic une chaîne de caractères qui a été modifiée dans la DLL. | |
|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème en adressage de strings par ADR() ? Mar 22 Fév 2011 - 15:16 | |
| Pour retourner un string à Panoramic, il y a plusieurs solutions. Première possibilité: - Code:
-
function FileCreate(root, filter, fichier, filsiz: integer):integer; stdcall; export; var fic: string; exist: boolean; pstr: pstring; KGFSaveDialog: TSaveDialog; sfic: integer; sfichier: integer;
begin KGFSaveDialog := TSaveDialog.Create(nil); pstr := pstring(root); KGFSaveDialog.InitialDir := pstr^; pstr := pstring(filter); KGFSaveDialog.Filter := pstr^; exist := KGFSaveDialog.Execute; fic := '_'; result := 0; if exist then begin fic := KGFSaveDialog.FileName; sfic := sizeof(fic); sfichier := filsiz; if sfic<sfichier then sfichier := sfic; pstr := pstring(fichier); move(fic,pstr^,sfichier); if fileexists(fic) then result := 2 else result := 1; end; KGFSaveDialog.Free; end;
2ème possibilité: - Code:
-
// sélection un répertoire avec création function FolderSelectWithCreate(root, folder, sfolder: integer): integer; stdcall; var dir: string; sfic, sfold: integer; pstr: pstring; i: integer; PB: pByte; char: pchar; begin pstr := pstring(root); dir := pstr^; if SelectDirectory(dir, [sdAllowCreate, sdPerformCreate, sdPrompt],SELDIRHELP) then begin sfic := length(dir); sfold := sfolder; PB := pbyte(pstring(folder)^); if sfic<sfold then sfold := sfic; for i:=1 to sfold do begin char := pchar(midstr(dir,i,1)); PB^ := Byte(char^); inc(PB); end; result := 1; end else begin result := 0; end; end;
3ème possibilité: - Code:
-
// send a text message to Panoramic Edit field by field handle function IPCSendMessage(const mes: pchar; const lon: integer; const hnd: integer): integer; stdcall; export; var i: integer; pstr: PString; str1: pchar; begin pstr := PString(mes); str1 := pchar(pstr^); i := SendMessage(hnd, WM_SETTEXT, lon, LParam(str1)); //on récupere le texte result := i; end;
La dernière possibilité permet d'intercepter, en Panoramic, l'arrivée du texte par un évènement on_change. J'ai aussi le code pour trouver le handle d'un objet EDIT si cela t'intéresse. Ces 3 exemples sont extraits de ma dll KGF.dll, et ce sont donc des routines qui marchent. Je suis sûr qu'il y a d'autres moyens de retourner un string, mais ce sont ceux que j'ai trouvés. | |
|
Contenu sponsorisé
| Sujet: Re: Problème en adressage de strings par ADR() ? | |
| |
|