GetLastName(FullDirectory.s)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: GetLastName(FullDirectory.s)

Message par Kwai chang caine »

Merci PAPIPP
C'est rigolo c'tte combine 8O
Je pensais qu'une fois qu'on redonnait la valeur courte a b$ on perdait les 6000 octets immediatement :roll:
Mais en fin de compte t'es un malin !!!! :D
Si je comprend, tu veux dire que comme on donne 6k de place juste avant a b$, l'exe n'a pas le temps d’écrire quoi que ce soit sur ces 6K :wink:
Pas mal la combine, pas mal.... à retenir aussi 8)

Par contre ça ne marche a mon avis plus si tu envois le b$ a un moment du programme, que ce dernier continue a bosser et reçois au bout d'un moment la valeur de b$
Car j'ai peur que dans ce cas l'EXE ai le temps de copier des choses dans les 6k qui ont été libérés en ecrivant b$="c:\Kcc" :roll:

En tout cas encore merci de la combine 8)

@DOBRO
de plus dans l'absolu la fonction modifie une variable (chaine) qu'on lui donne..
elle ne vas pas chercher a poker une variable du prg appelant
Bah j'sais pas ce qui te faut, quant tu envoie un pointeur, j'vois pas ce que cette API pourrait faire d'autre que POKER avec...et c'est justement ça le bleme, elle POKE, elle POKE parce que si elle demandait l'autorisation a l'EXE, jamais il écrirait naturellement sur le Chr(0) :roll:
de plus dans l'absolu la fonction modifie une variable (chaine) qu'on lui donne..
elle ne vas pas chercher a poker une variable du prg appelant
Ouuuiii !! cette methode j'ai du en entendre parler dans ma quette de plusieurs mois, pour la communication interprocess
Mais je l'ai zappé, parce qu'a force de faire des methodes, j'suis retourné aux pointeurs avant d'essayer.

Merci de la combine, c'est cool ce truc, ça pourrait me servir on sait jamais
C'est d'autant plus cool si ça peut passer par le reseau 8)
Je la met dans ma cu...dans hotte j'voulais dire 8)
tu vois meme CROCRO se sert de fichiers (Ram_file) pour la transmission interProcess !
Bien sur que je le vois....des fois j'te soupçonne de pas tout lire ce que j'ecris, car le filemapping, les Sendmessages, la mémoire partagée, toutes ces méthodes que j'ai légèrement exploré, c'est bien aussi lui qui les a créée :roll:
D'ailleurs y'a tellement de méthodes qu'on arrive a se demander pourquoi y'en a tant 8O

Enfin on va pas se plaindre...mais la ou tu va me reconnaitre..comme quoi on fait pas d'un âne un cheval de course....
Et ben je préfère mes pointeurs à toutes ces methodes en API :mrgreen:
Pour une fois...qu'il faut utiliser les API..et ben j'ai pas envie :? :lol:

En tout cas encore merci, de ton partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: GetLastName(FullDirectory.s)

Message par Backup »

Kwai chang caine a écrit :

@DOBRO
de plus dans l'absolu la fonction modifie une variable (chaine) qu'on lui donne..
elle ne vas pas chercher a poker une variable du prg appelant
Bah j'sais pas ce qui te faut, quant tu envoie un pointeur, j'vois pas ce que cette API pourrait faire d'autre que POKER avec...et c'est justement ça le bleme, elle POKE, elle POKE parce que si elle demandait l'autorisation a l'EXE, jamais il écrirait naturellement sur le Chr(0) :roll:
tu ne m'a pas compris

lorsque tu fais :
PathAddBackslash_(a$) tu fournis a$
l'api poke A$ , mais ne cherche pas a poker X$, ou z$ qui serai dans ton prg appelant !

toi tu voudrais une dll qui puisse poker n'importe qu'elle valeur du prg appelant voir un tableau, une structure un liste etc ...
du moins c'est ce qui m'a semblé ..

ps: l'utilisation de :
pour une chaine

Code : Tout sélectionner

 ret$=peeks( CallFunction(0, "PathAddBackslash", @a$) )
ou pour une valeur

Code : Tout sélectionner

 ret= CallFunction(0, "PathAddBackslash", @a$) 
est tout a fait normale !!
c'est meme LA façon de récupérer une valeur (chaine) renvoyé par une DLL
voir doc

l'autre façon c'est d'utiliser un prototype
ça reviens quasi au meme , sauf que ça gere les quads .etc ....

bon allez .. je retourne a EPB :)
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: GetLastName(FullDirectory.s)

Message par PAPIPP »

@KCC

Voici le prg ASM généré par PB où l’on voit qu’a la deuxième affectation la routine SYS_fastAllocateStringFree peut effectivement reprendre une partie de la mémoire allouée.
Il faut demander à FRED si c’est le cas.

Code : Tout sélectionner

; a$="c:\Kcc"
	MOV	 edx,_S3
	LEA	 ecx,[v_a$]
	CALL	 SYS_FastAllocateStringFree
; PathAddBackslash(@a$)
	MOV	 eax,dword [v_a$]
	PUSH	 eax
	CALL	 _Procedure0
; b$=Space(6000)
	MOV	 eax,[_PB_StringBasePosition]
	PUSH	 eax
	PUSH	 eax
	PUSH	 dword 6000
	CALL	 _PB_Space@8
	PUSH	 dword v_b$
	CALL	 _SYS_AllocateString4@8
; b$="c:\Kcc"
	MOV	 edx,_S3
	LEA	 ecx,[v_b$]
	CALL	 SYS_FastAllocateStringFree
; PathAddNoirDeBackslash(@b$)
	MOV	 eax,dword [v_b$]
	PUSH	 eax
	CALL	 _Procedure2
; Debug a$
@+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: GetLastName(FullDirectory.s)

Message par PAPIPP »

@KCC
Voici une nouvelle solution

Code : Tout sélectionner

ProcedureDLL PathAddBackslash(Path)
  
 
  mem=Path
  path$=ReverseString(PeekS(mem))
  
  If Mid(Path$,1,1)<>"\"
    Path$="\"+Path$
    Path$=ReverseString(Path$)
    PokeS(mem,path$)
  EndIf
  
EndProcedure

ProcedureDLL PathAddNoirDeBackslash(Path)
  
 
  mem=Path
  path$=ReverseString(PeekS(mem))
  
  If Mid(Path$,1,1)<>"\"
    Path$=RSet("",5000,"\")+Path$
    Path$=ReverseString(Path$)
    PokeS(mem,path$)
  EndIf
  
EndProcedure

a$="c:\Kcc"
PathAddBackslash(@a$)
b${6000}="c:\Kcc"
C$="jkjkksdjkldkls"
PathAddNoirDeBackslash(@b$)
Debug a$
Debug b$
avec l'ASM généré

Code : Tout sélectionner


; 
; a$="c:\Kcc"
	MOV	 edx,_S3
	LEA	 ecx,[v_a$]
	CALL	 SYS_FastAllocateStringFree
; PathAddBackslash(@a$)
	MOV	 eax,dword [v_a$]
	PUSH	 eax
	CALL	 _Procedure0
; b${6000}="c:\Kcc"
	LEA	 eax,[v_b$]
	PUSH	 dword _S3
	PUSH	 dword 6000
	CALL	 _SYS_AssignFixedStringFast@8
; C$="jkjkksdjkldkls"
	MOV	 edx,_S4
	LEA	 ecx,[v_C$]
	CALL	 SYS_FastAllocateStringFree
; PathAddNoirDeBackslash(@b$)
	PUSH	 dword v_b$
	CALL	 _Procedure2
; Debug a$
; Debug b$

La routine est ici _SYS_AssignFixedStringFast@8 je pense qu'elle ne rend pas la mémoire allouée.

@+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: GetLastName(FullDirectory.s)

Message par Kwai chang caine »

PathAddBackslash_(a$) tu fournis a$
Et ben un truc de guedin que je viens de m'appercevoir, c'est que moi je fournissais pas de string contrairement à ce que tu dit, mais bien un pointeur
Mais le plus fou c'est que ça marche comme tu le dis aussi 8O

On peut envoyer un pointeur ou une variable...
Si on pouvait faire ça a toutes nos procedure, ça nous simplifierais drolement la vie de pas avoir a choisir entre un long et un string :?
Quand tu pense que FRED il a obligé de passer tout en long, meme les strings
Avec cette technique, j'sais pas comment ils font mais c'est cool

Code : Tout sélectionner

a$ = "c:\kcc"
PathAddBackslash_(a$)
Debug a$

b$ = "c:\kcc"
PathAddBackslash_(@b$)
Debug b$
@PAPIPP
Bah j'y connais rien, mais je trouvais ça logique non ???
C'est un peu comme les disque durs, je suppose que des que y'a un trou, et que il a pas le choix, ou peut être même tout le temps, un EXE doit écrire dedans...
Mais comme tu le dit....c'est FRED qui pourrait nous éclairer
Voici le prg ASM généré par PB où l’on voit qu’a la deuxième affectation la routine SYS_fastAllocateStringFree
Ou TU vois ..parce que moi, je vois juste le plus beau langage qui me fait rêver...
Mais a part rêver... :oops: :lol:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: GetLastName(FullDirectory.s)

Message par Kwai chang caine »

Ouaaahh j'savais meme pas qu'on pouvais forcer la taille d'une variable avec

Code : Tout sélectionner

b${6000}="c:\Kcc"
8O
J'ai jamais utilisé cette fonction

C'est sur que si tu bloque la mémoire, je pense qu'elle va pas piocher dedans :roll:
Mais dis donc, faut pas en abuser de cette fonction, sinon ça doit bouffer noir de mémoire :?

En tout cas merci beaucoup, je vais noter la combine 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: GetLastName(FullDirectory.s)

Message par Backup »

Kwai chang caine a écrit :Ouaaahh j'savais meme pas qu'on pouvais forcer la taille d'une variable avec

Code : Tout sélectionner

b${6000}="c:\Kcc"
8O
J'ai jamais utilisé cette fonction
moi non plus 8O
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: GetLastName(FullDirectory.s)

Message par Ar-S »

Idem :)
C'est sûr qu'il doit pas falloir abuser de cette methode.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: GetLastName(FullDirectory.s)

Message par PAPIPP »

@KCC

Merci pour la correction L’ ON VOIT en TU VOIS
Mais en fait la difficulté pour moi, c’est de ne pas être aveugle ou miro comme je l’ai déjà dit à DOBRO. :lol: :lol: :lol:
@+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: GetLastName(FullDirectory.s)

Message par Backup »

PAPIPP a écrit :@KCC

Merci pour la correction L’ ON VOIT en TU VOIS
Mais en fait la difficulté pour moi, c’est de ne pas être aveugle ou miro comme je l’ai déjà dit à DOBRO. :lol: :lol: :lol:
@+
je sais pas j'ai rien entendu j'suis sourding :lol:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: GetLastName(FullDirectory.s)

Message par Ar-S »

Mais qui êtes vous ? (alzheimer man ^^)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: GetLastName(FullDirectory.s)

Message par Kwai chang caine »

Mais en fait la difficulté pour moi, c’est de ne pas être aveugle ou miro comme je l’ai déjà dit à DOBRO
Ouaih!! bah en attendant, j'aimerais bien être miro comme toi !! :roll:
Et savoir lire que des mots en majuscule ne dépassant pas quatre lettres :mrgreen:

Code : Tout sélectionner

PUSH la poubelle
MOV au boulot
JUMP dans la baignoire
etc ...
J'crois que je vais parler a ma femme et mes chiens comme ça, pour commencer à m'habituer à toucher mon reve :mrgreen:

Pour en revenir a ta super combine, c'est rigolo, parce que on fait

Code : Tout sélectionner

b${6000}="c:\Kcc"
puis juste apres

Code : Tout sélectionner

Len(b$)
et ben il remonte bien 6 8O
Donc en fait, je pense que le LEN s’arrête au premier chr(0) rencontré :roll:
Donc d’après toi, avec ta super fonction inconnue de pas mal de nous, la mémoire ne va jamais piocher dedans, car elle est attribuée a b$ ???
D'ailleurs je me demande a quoi elle sert cette fonction, y'a surement une utilité utile :mrgreen:
Remarque ça me donne une idée, qui sert surement a rien..mais on pourrait cacher une donnée juste derrière le chr(0), a la manière des portes au fond des armoires, le chr(0) faisant office de porte, et écrire dedans en étant sur que personne y touchera... :D
Bon tu va me dire avec un allocatememory c'est pareil..mais le coup de la porte cachée ça me plait :lol:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: GetLastName(FullDirectory.s)

Message par PAPIPP »

@KCC

Oui toutes le commandes PB relatives aux chaines de caractères sont limitées au premier octet $00 rencontré
Il en est de même pour les routines de PB ce qui simplifie le travail du compilateur PB.
Or lorsqu’on utilise une chaine de caractère fixe par définition on connait sa longueur.
Le compilateur dans ce cas peut effectuer une copie complète de la zone ce qui n'est pas le cas actuellement.
J'avais demandé il y a quelque temps si une modification pouvais être réalisée;

http://www.purebasic.fr/french/viewtopi ... 57#p118757
http://www.purebasic.fr/french/viewtopi ... =5&t=10945
De toute manière ceci n’est pas de notre ressort mais de celui des concepteurs de PB qui doivent faire des essais.
Ceci fait aussi partie de la demande mais à priori il n'y a pas de problème.

(*1) la routine " _SYS_AssignFixedString" bien qu'elle connaisse la longueur de chaîne à copier s'arrête de copier lorsqu'elle rencontre $00. Je demande simplement que cette routine copie tout ce qu'elle rencontre sur la longueur demandée.
@+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: GetLastName(FullDirectory.s)

Message par Kwai chang caine »

D'accord, merci beaucoup PAPIPP pour tes explications
Quand j'ai lu cette ligne...je sais pas pourquoi..mais des sentiments profonds de désespoir à mon encontre, ainsi que de surcroit d'admiration et d'affection envers toi sont simultanément nés

Code : Tout sélectionner

"$"+RSet(Hex(PeekQ(@__HQ+2),#PB_Quad),16,"0")+RSet(Hex(PeekC(@__HQ+1),#PB_Byte),2,"0")+RSet(Hex(PeekC(@__HQ),#PB_Byte),2,"0")
C'est beau.... 8O
Et j'aurais pas dit mieux :mrgreen:
Si peut être ....quand j'me coince quelque chose dans un tiroir :D
Faudrait que je voie...ça peut peut être m'aider à devenir intelligent :roll:

En tout cas...je suis d'accord, j'ai pas le choix :oops: :lol:
Encore merci de partager ta connaissance 8)

Bon Week end
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre