Peeks et unicode ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ulix
Messages : 315
Inscription : ven. 04/juin/2004 14:27
Localisation : Frontignan

Peeks et unicode ?

Message par Ulix »

Voilà mon problème !

Lorsque que mon programme est compiler sans l'option unicode la procédure ImprimanteInfos() me renvoie bien les bonnes informations sur l'imprimante
Par contre lorsque le programme est compiler en unicode, l'instruction
peeks n'est pas capable de lire la portion mémoire (les données sont illisible)
J'ai bidouillé une autre procédure LectureMemoire() pour me dépatouillé, mais j'en suis pas content.
Certes le résultat est OK, mais je trouve le procédé pas très propre.

J'ai du mal utilisé peeks( ,,options) ?
Quelqu'un peut-il me montre comment faire pour obtenir le bon résultat? :lol:

Code : Tout sélectionner


Procedure.s LectureMemoire(Valeur.l)
;Lecture de la mémoire a l'adresse indiqué
;jusqu'a avoir deux zéro
Define V1.b, V2.b, Txt$

Txt$ = ""
Repeat
    
    V1 = PeekB(Valeur) 	 ;: Debug Str(PeekB(Valeur))		+"   "+Chr(PeekB(Valeur))
  	V2 = PeekB(Valeur+1) ;: Debug Str(PeekB(Valeur+1))	+"   "+Chr(PeekB(Valeur+1))
  	Valeur+2	;2 position pour l'unicode
  	
  	If V1 = 0 And V2 =0 
  					Break		;les 2 valeur a 0 pour sortir
   	Else 
  					Txt$ + Chr(V1)+Chr(V2);cumul
  	EndIf
ForEver

;Debug Txt$
ProcedureReturn Txt$	
		
EndProcedure



Procedure.s ImprimanteInfos(Info.b)
;Le but de cette procedure est de retourné le nom de l'imprimante
;selectionnée et non pas l'imprimante par defaut
;


Define PrintDlg.PRINTDLG, *DEVNAMES.DEVNAMES
Define Info$



PrintDlg\hDevMode = 0
PrintDlg\hDevNames = 0
PrintDlg\lStructSize = SizeOf(PRINTDLG)
PrintDlg\Flags = #PD_ALLPAGES;|#PD_RETURNDEFAULT 

Info$ = ""

If PrintDlg_(PrintDlg) <> #FALSE
    	*DEVNAMES.DEVNAMES = GlobalLock_(PrintDlg\hDevNames)
    
    
    	If  #PB_Compiler_Unicode 
      				;vérifier que le programme soit bien compiler en UNICODE
      				;pour pouvoir teste les ligne suivantes.
      				;Pourquoi ne puis-je pas lire avec un peek de l'unicode ???
      				;Me serais-je trompé de peek ???
      				;J'ai essayé avec les 3 options, aucun ne me renvoi le résultat
      				;attendu (comme la procedure LectureMemoire) Pourquoi ???
      				
      				
      				
      				
      				;Nom$ = PeekS(*DEVNAMES + *DEVNAMES\wDeviceOffset, -1,#PB_Unicode);marche pas
	    				;Nom$ = PeekS(*DEVNAMES + *DEVNAMES\wDeviceOffset, -1,#PB_UTF8   );marche pas
	    				;Nom$ = PeekS(*DEVNAMES + *DEVNAMES\wDeviceOffset, -1,#PB_ASCII  );marche pas
     					;MessageRequester("Nom = ", Nom$, #MB_ICONINFORMATION)
     					
      				
      				;Alors comme je n'arrivais a utilisé le "peeks" pas j'ai fais (vite pour me dépanné)
      				;cette procedure. Tester pour voir le résultat que j'espérais obtenir
      				;avec peeks!!!
      				
      				;Décommenter les lignes suivantes pour testé ma petite
      				;procedure LectureMemoire(Valeur.l)
      				;Je trouve la façon de faire pas très propre!!!!
      				Select Info
			    		Case 1	:	;renvoi le nom du pilote utilisé par l'imprimante
										    Debut = *DEVNAMES + (*DEVNAMES\wDriverOffset*2)
										    Info$ =  LectureMemoire(Debut)
										    ;MessageRequester("Pilote = ", Info$, #MB_ICONINFORMATION)
					    
					    Case 2	:	;renvoi le nom de l'imprimante
										    Debut = *DEVNAMES + (*DEVNAMES\wDeviceOffset*2)
										    Info$ =  LectureMemoire(Debut)
										    ;MessageRequester("Nom = ", Info$, #MB_ICONINFORMATION)
					   	
					   	Case 3	:	;renvoi le nom de port de l'imprimante
										    Debut = *DEVNAMES + (*DEVNAMES\wOutputOffset*2)
										    Info$ =  LectureMemoire(Debut)
										    ;MessageRequester("Port = ", Info$, #MB_ICONINFORMATION)
    
    					Default	;autre cas 
			    							Info$ = ""
			    		EndSelect
    	
    	
    	Else 
			    		;programme compiler en ASCII, c'est OK
			    		Select Info
			    		Case 1	:	;renvoi le nom du pilote utilisé par l'imprimante
			    							Info$ = PeekS(*DEVNAMES + *DEVNAMES\wDriverOffset, -1,#PB_Ascii)
			    							
			    		Case 2	:	;renvoi le nom de l'imprimante
										    Info$ = PeekS(*DEVNAMES + *DEVNAMES\wDeviceOffset, -1,#PB_Ascii)
										    
					    Case 3	:	;renvoi le nom de port de l'imprimante
										    Info$ =  PeekS(*DEVNAMES + *DEVNAMES\wOutputOffset, -1,#PB_Ascii)
										    
			    		Default	;autre cas
			    							Info$ = ""
			    		EndSelect
    		
    	EndIf
    	GlobalUnlock_(PrintDlg\hDevNames)
    	GlobalFree_(PrintDlg\hDevNames) 
    	ProcedureReturn Info$

 

Else ;pas réussi a trouve le nom
   		ProcedureReturn ""
    

EndIf
EndProcedure


;pour tester
Debug "Pilote     : "+ ImprimanteInfos(1)

Debug "Imprimante : "+ ImprimanteInfos(2)

Debug "Port       : "+ ImprimanteInfos(3)
Merci d'avance a tous ceux qui y jetteront un œil !
(N'oublié pas de le ramassé, ça fais désordre :wink: )
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

en unicode un caractère est codé sur 2 octet donc si tu compile en unicode avec peeks il va essayer de lire des caractères sur 2 octet or il semblerai ton imprimante renvoie de l'acssi qui utilise 1 octet par caractère. je te conseille relire la doc de peeks en regardant bien les options. ( PeekS(*ZoneMemoire , Longueur , #PB_Ascii))
Répondre