Page 1 sur 1

Detecter une variable UNICODE ou ASCI d'apres son pointeur

Publié : jeu. 08/oct./2009 11:15
par Kwai chang caine
Bonjour à tous

Dans mon code :

Code : Tout sélectionner

Procedure ArrayExe2Local(*strPtr.INTEGER, Array Array2Modify.s(1), ArraySize)
 
 #ArrayPB = 1
 #ArrayVB = 2
  
 *strPtr + SizeOf(INTEGER)
             
  If Not TypeArray
   
   Donnee$ = PeekS(*strPtr\i, - 1, #PB_Unicode) ; Array from VB
     
j'ai essayé :

Code : Tout sélectionner

IsTextUnicode_(Donnee$, Len(Donnee$), 2)
Ou bien

Code : Tout sélectionner

IsTextUnicode_(*strPtr\i, 4, 2)
Et j'ai le ruban rouge cadeau :cry:

Donc j'arrive pas a detecter si ma variable est UNICODE avec cette API

Par contre j'ai essayé une autre combine
Je me suis rapellé que l'UNICODE c'est le chiffre ASCII suivi de chr(0)
Alors je me suis dit que si je testais un caractere sur deux, je saurais si c'est de l'ASCII ou non

Qu'en pensez vous ???

Code : Tout sélectionner

Procedure ArrayExe2Local(*strPtr.INTEGER, Array Array2Modify.s(1), ArraySize)
 
 #ArrayPB = 1
 #ArrayVB = 2
 
 If PeekB(*strPtr\i + 1) = 0
  TypeArray = #ArrayVB 
 Else
  TypeArray = #ArrayPB
 EndIf
   
Merci de votre aide et bonne journée

Re: Detecter une variable UNICODE ou ASCI d'apres son pointeur

Publié : jeu. 08/oct./2009 12:00
par Kwai chang caine
Bah j'me repond a moi meme...comme dirait jean pierre ...
C'est de la meeeeeerdeeee !!!

Ca marche pas...
J'comprend pas, j'ai trouvé un POST sur le US qui en parle
Et Helpy y dit bien de l'utiliser comme ça
http://www.purebasic.fr/english/viewtop ... 079#p51079

Alors j'ai fait ça ...et ça marche pas non plus :cry:

Code : Tout sélectionner

 *Pointeur.l = *strPtr\i
 
 If Not TypeArray

  If IsTextUnicode_(*Pointeur , 1, #Null )
   TypeArray = #ArrayVB 
  Else
   TypeArray = #ArrayPB
  EndIf
  
 EndIf

Re: Detecter une variable UNICODE ou ASCI d'apres son pointeur

Publié : jeu. 08/oct./2009 13:06
par flaith
Je sais pas trop si tu cherches un truc du genre :

Code : Tout sélectionner

Global BufferSize    = 1024
text_unicode$ = "Ceci est un texte en Unicode"
text_ascii$   = "Ceci est un texte en Ascii"

Procedure.i Make_Unicode(text.s)
  *str = AllocateMemory(BufferSize)
  PokeS(*str, text, -1, #PB_Unicode)
  ProcedureReturn *str
EndProcedure

Procedure.i Make_Ascii(text.s)
  *str = AllocateMemory(BufferSize)
  PokeS(*str, text, -1, #PB_Ascii)
  ProcedureReturn *str
EndProcedure

Procedure.s Check_UA(*adr_text)

  If IsTextUnicode_(*adr_text, MemoryStringLength(*adr_text, #PB_Unicode), #Null)
    ProcedureReturn "Unicode"
  Else
    ProcedureReturn "Ascii"
  EndIf
EndProcedure

*adr_unicode = Make_Unicode(text_unicode$)
*adr_ascii   = Make_Ascii(text_ascii$)

Debug Check_UA(*adr_unicode)
Debug Check_UA(*adr_ascii)
:mrgreen:

Re: Detecter une variable UNICODE ou ASCI d'apres son pointeur

Publié : jeu. 08/oct./2009 13:20
par Kwai chang caine
Mille merci FLAITH 8)
C'est exactement ça...mais comme dab àa marche avec notre PB cheri...mais pas moyen que ça marche avec VB :?
J'ai essayé d'entrer ton code en lui passant la variable structurée....puis une copie par une variable..mais j'obtiens toujours "ASCII" :cry:

Y commence vraiment a me brouter les noyaux ce bilou :?

Code : Tout sélectionner

Procedure.s Check_UA(*adr_text)

  If IsTextUnicode_(*adr_text, MemoryStringLength(*adr_text, #PB_Unicode), #Null)
    ProcedureReturn "Unicode"
  Else
    ProcedureReturn "Ascii"
  EndIf
EndProcedure

Procedure ArrayExe2Local(*strPtr.INTEGER, Array Array2Modify.s(1), ArraySize)
 
 *Pointer.l = *strPtr\i
 MessageRequester("", Check_UA(*strPtr\i))
 MessageRequester("", Check_UA(*Pointer))

Re: Detecter une variable UNICODE ou ASCI d'apres son pointeur

Publié : jeu. 08/oct./2009 13:37
par djes
Il y a un truc que je me demande : pourquoi tu veux absolument passer un pointeur sur un tableau? Pourquoi tu n'essayes pas des transferts de chaînes, en utilisant StrPtr() du côté VB? Ce serait plus simple, non, et la conversion serait assurée par VB.

Re: Detecter une variable UNICODE ou ASCI d'apres son pointeur

Publié : jeu. 08/oct./2009 13:55
par Kwai chang caine
Attend attend attend 8O
Tu me dis quoi la ...

Quand on fait StrPtr() dans VB, il converti de l'unicode en ASCII ???? 8O
C'est peut etre pour ça que le code de FLAITH il marche pas :roll:

Par contre t'avais raison DJES....je sais tu as toujours raison :mrgreen:
Je me suis fait du mouron pour rien....
Dans la vie il suffit d'essayer....comme j'mettais rongé les ongles jusqu'au plalanges, j'me suis dit tiens..comme y dit mon ami DJES....pourquoi pas faire l'essai

Et votre KCC...oui oui le votre celui qui arrive a rien....le gerome bonaldi de PB....le patrick carmouze du forum..il a forcer tres fort...presque comme aux toilettes et il a pondu ça.

Code : Tout sélectionner

Dim a.s(10)
Define b$ = Space(4)
a(0) = "Kcc 0"
Debug "Adresse de @a(0) = " + Str(@a(0))
Debug "Adresse de @b$ = " + Str(@b$)
Debug ""
RtlMoveMemory_(@b$, @a(0), 2)
Debug "Adresse de @a(0) = " + Str(@a(0))
Debug "Adresse de @b$ = " + Str(@b$)
Debug b$
CQFD...comme tu le disais dans le post ASM...c'est une copie....
Les adresses pointeurs ne sont pas déplacée.
Donc mon code VB que je vous ai posté devrait marcher

Je me rapelle la connerie que j'avais fait car en un mois, j'ai eu le temps d'en faire.
Et que je me suis fais gronder par SROD

Je retournais le pointeur tableau de la DLL DIRECTEMENT dans un tableau de l'exe

Code : Tout sélectionner

ProcedureDLL Bonaldi()
 Static Dim TabloDLL(2)
 ProcedureReturn @TabloDLL()
EndProcedure

Dim TabloEXE(0)
TabloEXE() = Bonaldi()
Et ça c'est pas bien :oops:
Parce que des que l'EXE il libere son tableau....il libere celui de la DLL aussi :?
Puisque la copie du tableau de DLL est fait BYREF comme dirait bilou :D
Les deux tableaux ont les memes pointeurs

Je viens de tester...comme dirais DJES :wink: et c'est exactement ça mon erreur depuis 1 mois.
Je commence a quitter londre pour le midi :D

Code de la DLL

Code : Tout sélectionner

ProcedureDLL Essai()
 Static Dim a.s(1)
 a(0) = "Kcc 0" 
 MessageRequester("", Str(@a(0)))
 ProcedureReturn @a()
EndProcedure 
Code de l'EXE

Code : Tout sélectionner

If OpenLibrary(0, "c:\RenvoiTablo.dll")
 Dim TabloEXE.s(0)
 TabloEXE() = CallFunction(0, "Essai")
 Debug @TabloEXE(0)
 CloseLibrary(0)
EndIf

Re: Detecter une variable UNICODE ou ASCI d'apres son pointeur

Publié : jeu. 08/oct./2009 15:08
par Kwai chang caine
Il y a un truc que je me demande : pourquoi tu veux absolument passer un pointeur sur un tableau? Pourquoi tu n'essayes pas des transferts de chaînes, en utilisant StrPtr() du côté VB?
Et ben parce que je suis un jambon beurre !!! :oops:
Ca fait 100 fois que je relis les fonctions de StrPtr et VarPtr et que j'avais pas compris :oops:

VarPtr renvoie l'adresse de la variable donc son pointeur comme @a(x)
Et StrPtr renvoie l'adresse de la string donc PeekL(@a(x))

Et je viens juste de comprendre....oulalala aujourd'hui est un grand jour...j'en ai compris des choses 8O

Alors maintenant que j'ai compris ta question...je vais pouvoir repondre :mrgreen:

Et ben j'essaye de faire un transfert le plus court possible en code.
Sour cette forme, cela me fait une procedure dans la DLL pour recuperer le tableau VB, et une procedure dans l'EXE pour modifier le tableau du depart.
Donc 2 procedure et ça baigne

Si j'utilise StrPtr...je vais etre obligé de faire une boucle pour envoyer tous les enregistrements du tableau dans l'EXE, donc une procedure de plus.
La comme j'envoie le VarPtr du premier element du tableau, car je viens de lire que VB ne sait pas envoyer l'adresse du tableau, et bien ça se demerde dans la DLL et je gagne une procedure.

Encore une fois, ce code est le coeur de 10 zaines de mes fonctions, dans pas mal de mes programmes.
Il faut que je fasse quelque chose qui marche a coup sur...et le moins long possible pour que son utilisation soit facile.

Voila....et mon ami FLAITH ....il a pas trouvé pourquoi son super code y marche avec PB et pas avec VB ??? :(
Est ce bien de l'unicode que VarPtr envoie ????

Re: Detecter une variable UNICODE ou ASCI d'apres son pointeur

Publié : jeu. 08/oct./2009 15:32
par Kwai chang caine
Bon je crois avoir compris pourquoi le code de mon bon FLAITH y marche pas :D

Parce que son code analyse un pointeur de string.
Et mois j'envoie un pointeur de variable et qui plus est structuré...

Il faut que j'arrive a passer le pointeur de la string ....
Je replonge......
Image

Re: Detecter une variable UNICODE ou ASCI d'apres son pointeur

Publié : jeu. 08/oct./2009 15:46
par djes
:lol:
L'avantage du Strptr est que ça t'évite les conversions dans des formats un peu spéciaux (entre les différents unicodes et l'ascii et autres), ça t'évite d'utiliser IsTextUnicode qui est buggée, et ça simplifie tout. Je ne vois pas trop l'intérêt de l'envoi en masse, mais faut voir ça au cas par cas.

Re: Detecter une variable UNICODE ou ASCI d'apres son pointeur

Publié : jeu. 08/oct./2009 15:49
par Kwai chang caine
Donc tu veux dire que j'ai pas dit de connerie 8O
Tu veux dire que ce que j'ai dit tu l'a compris.....et qu'en plus tu as pu repondre 8O

Ouuaahhh !!!! KCC il est content..il parle avec des programmeurs et ils le comprennent 8)

Ah !!! donc ce serait normal que ça marche pas l'API IsUnicode :cry:
JE vais replonger dans l'histoire du chr(0) un coup sur deux...ça marche bien tout le temps ça ? :roll:

Re: Detecter une variable UNICODE ou ASCI d'apres son pointeur

Publié : jeu. 08/oct./2009 16:10
par djes
Ca dépend de tes besoins. Pour moi c'est de la bidouille pas trop fiable, mais bon, avec VB...

Re: Detecter une variable UNICODE ou ASCI d'apres son pointeur

Publié : mar. 13/oct./2009 11:49
par Kwai chang caine
Bon j'suis fatigué de creuser, parce qu'a force j'ai le cul en l'air et j'ai peur qu'un mec passe et me prenne pour un range velo :?

Alors en attendant..pour detecter quel exe appelle, j'ai pensé a une des differences qui font que nombre de mes programmes plantaient, quand je les convertissais de VB a PB... :twisted:

LE TRUE.....

Non non, pas celui que l'on vois à force que je creuse...... :?
La constante True de VB et #True de PB

Car pour VB True = -1 (Ah le con :lol:)
Et pour PB, je peux vous donner le secret....c'est #True = 1 (Si ça sort de la...j'serais que c'est vous :?)

Donc comme je suis obligé d'envoyer dans la DLL, le ArraySize pour pas que j'aille piocher dans la memoire n'importe ou....et bien "j'm'est dit"...
KCC et si tu utilisais ce qui te casse les noisettes, en multipliant la taille du tableau par "TRUE"

"Ouaiche"....je sais c'est de la KCCprog :oops:
Et de l'autre coté ...si la taille tableau est inferieur a 0..c'est ce bourrin de VB qui appelle...et si c'est superieur a 0...c'est PB d'amour :D

Appel de VB

Code : Tout sélectionner

FunctionOfDll(VarPtr(ArrayString(0)), UBound(ArrayString()) * True)
Appel de PB

Code : Tout sélectionner

CallFunction(0, "FunctionOfDll", ArrayString(), ArraySize(ArrayString()) * #True)
Dans la DLL

Code : Tout sélectionner

If ArraySize < 0
   ArraySize = ArraySize * (-1)
   TypeArray = #ArrayVB
  Else 
   TypeArray = #ArrayPB
  EndIf
N L U C E C T S K

Ding dooooong !!!

Voila le temps est passé alors combien de lettre ??
4
Oui ?
SUCE

Et pour monsieur ????
Mot complet
KCC EST NUL
Bravooooooo....Clap clap clap :oops:

Voila..j'ai honte....mais bon ça devrait etre fiable :oops:

Mais bon si y'en a un qui a une idée pour trouver si la variable en memoire est UNICODE ou ASCII
Qu'il hesite pas a me contacter sur "3615 JMECACHE".........et sauver mon honneur qui me sert actuellement de paillason :oops:
Je suis toujours preneur 8)

Re: Detecter une variable UNICODE ou ASCI d'apres son pointeur

Publié : mar. 13/oct./2009 14:24
par djes
Au lieu de plancher sur un truc générique, essaye sur un cas concret, tu perdras moins de temps.

Re: Detecter une variable UNICODE ou ASCI d'apres son pointeur

Publié : mar. 13/oct./2009 15:25
par Kwai chang caine
Non c'est l'inverse....en fait, je suis parti d'un cas concret.
J'avais posé cette fonction dans X endroits de mes codes.
Et vu que j'appellais qu'une fois la fonction, je ne m'etais pas rendu compte du deplacement de pointeur de la DLL par l'exe :cry:
C'est donc a la suite du 2e appel, quand ça a merdé que je me suis mis a faire des fonctions generiques pour que vous puissiez me conseiller, et que je puisse readapter ce que je trouve et remplacer mes fonctions foireuses :?
Aujourd'hui c'est décidé, j'arrete de chercher et je remplace mes fonction foireuses par celle que je vous ai presenté avec copymemory et l'histoire du TRUE pour la detection VB/PB

En esperant qu'une fois remplacé ça recommence pas pour un tour