Peeks et unicode ?
Publié : jeu. 12/juin/2008 17:50
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?
Merci d'avance a tous ceux qui y jetteront un œil !
(N'oublié pas de le ramassé, ça fais désordre
)
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?

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)
(N'oublié pas de le ramassé, ça fais désordre
