Pas de problème (pb), que du PowerBuilder (PB) ^^

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 13-10-2011 10:18:10

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

[RESOLU] Fonction externe ANSI/UNICODE en PB11

Hello

j'ai une appli qui a été migré en PB11, et j'ai un souci d'encodage de chaine, j'ai la fonction externe :

Function ulong FindWindowA (ulong classname, string windowname) Library "USER32.DLL" alias for "FindWindowA;Ansi"


mais du coup comme mon paramètre windowname n'est plus en ANSI cela ne fonctionne plus.
Est il possible de convertir ma string a l'appel de la fonction ou il vaut mieux appeler la fonction FindWindowW? Dans ce cas je ne sais pas comment la déclarer?

Sinon une autre interrogation, dans la déclaration "FindWindowA;Ansi", pourquoi doit on mettre ANSI alors que l'on dit que l'on utilise la fonction FindWindowA qui est de type ANSI, je trouve cela redondant??

merci de votre aide

Dernière modification par bga (14-10-2011 12:36:34)

Hors ligne

 

#2 13-10-2011 10:33:39

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [RESOLU] Fonction externe ANSI/UNICODE en PB11

Bonjour,

De cette manière, peut-être (à tester) :

Code: pb

lb_blob = blob(ls_windowname) // EncodingUTF16LE! is default
ls_windownameansi = string(lb_blob, EncodingANSI!)

Hors ligne

 

#3 13-10-2011 10:35:00

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [RESOLU] Fonction externe ANSI/UNICODE en PB11

bga a écrit:

Hello

j'ai une appli qui a été migré en PB11, et j'ai un souci d'encodage de chaine, j'ai la fonction externe :

Function ulong FindWindowA (ulong classname, string windowname) Library "USER32.DLL" alias for "FindWindowA;Ansi"


mais du coup comme mon paramètre windowname n'est plus en ANSI cela ne fonctionne plus.
Est il possible de convertir ma string a l'appel de la fonction ou il vaut mieux appeler la fonction FindWindowW? Dans ce cas je ne sais pas comment la déclarer?

La fonction FindWindow existe aussi en version widechar (voir FindWindow sur MSDN) donc on peut modifier la déclaration du prototype en

Code: pb

Function ulong FindWindow (string classname, string windowname) Library "USER32.DLL" alias for "FindWindowW"

Attention, j'ai renommé la fonction. Vérifier l'impact sur le code, ou au pire remettre le 'a' à la fin du nom si trop de code est à modifier...

bga a écrit:

Sinon une autre interrogation, dans la déclaration "FindWindowA;Ansi", pourquoi doit on mettre ANSI alors que l'on dit que l'on utilise la fonction FindWindowA qui est de type ANSI, je trouve cela redondant??

Parce que PB ne sait pas que cette fonction attend du texte non unicode. Nous on le voit dans le nom de la fonction (avec le A ou W final), mais cela reste simplement une convention de nommage. Depuis la version 10 où PB utilise l'utf-16 en interne dans son moteur, il considère que tout passage de chaine avec l'api est par défaut unicode, dans le cas contraire il faut lui préciser avec le ";ansi" dans l'alias.

Dernière modification par seki (13-10-2011 11:44:37)


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#4 13-10-2011 11:33:26

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: [RESOLU] Fonction externe ANSI/UNICODE en PB11

ok merci je vais tester ca. Mais ca veut dire avec le ";ansi" qu'il aurait fait la convertion automatiquement? ca aurait du marcher alors?

Hors ligne

 

#5 13-10-2011 11:53:42

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [RESOLU] Fonction externe ANSI/UNICODE en PB11

bga a écrit:

ok merci je vais tester ca. Mais ca veut dire avec le ";ansi" qu'il aurait fait la convertion automatiquement? ca aurait du marcher alors?

*Grumpf*

Oui, mais non. Je viens de me relire et de voir que j'ai bêtement répondu sur la partie ansi / unicode sans vérifier le reste...

Alors 1) oui, l'appel d'une fonction api qui attend des chaînes ansi doit encore fonctionner si on ajoute ";ansi" dans l'alias
mais 2) le prototype de FindWindow c'est

Code:

HWND WINAPI FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName);

Autrement dit : les 2 arguments sont des chaines de caractères. La déclaration correcte de la fonction en PB est donc plutôt

Code: pb

Function ulong FindWindow (string classname, string windowname) Library "USER32.DLL" alias for "FindWindowW"


Vu que le 1er paramètre était déclaré en "ulong classname" (non testé, mais ça doit pouvoir fonctionner en PB < 10 vu qu'un pointeur vers une chaîne et un unsigned long c'est la même chose) la conversion automagique string ansi <-> string unicode ne pouvait pas se faire sur classname. Du coup FindWindowA devait recevoir un classname d'un seul caractère ce qui explique que ça ne fonctionnait plus.

Deuxième edit (merci xlat)
En fait ça dépend comment tu souhaites utiliser FindWindow. Si selon la doc tu ne veux pas utiliser classname, tu peux garder le "ulong classname" et passer 0 comme valeur (revient à passer null en C). Comme cela FindWindow ignore la classe et ne cherche que sur le nom.

(J'ai édité ma réponse précédente pour corriger la déclaration)

Dernière modification par seki (13-10-2011 12:08:58)


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#6 13-10-2011 12:05:21

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: [RESOLU] Fonction externe ANSI/UNICODE en PB11

en fait la fonction était déclarée ailleurs aussi :-(

Function UINT  FindWindowA (string classname, string windowname) Library "user32.dll" alias for "FindWindowA;Ansi"

donc ça devrait continuer a fonction avec le ;ANSI si j'ai bien compris. En fait j'ai pas de plantage mais j'ai l'impression que ca fonctionne plus et que ca vient de ca... je me trompe peut etre de voie

Hors ligne

 

#7 13-10-2011 12:16:23

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [RESOLU] Fonction externe ANSI/UNICODE en PB11

bga a écrit:

En fait j'ai pas de plantage mais j'ai l'impression que ca fonctionne plus et que ca vient de ca... je me trompe peut etre de voie

Ça dépend (ça dépasse) ©®.
Qu'as-tu comme résultat ? Que pensais tu avoir ?
Si vous utilisiez le classname pour la recherche, il est possible que le classname ait changé.
Si c'est pour rechercher une fenêtre ou un contrôle d'une autre application, Spy++ (voir dans les outils fournis avec Visual Studio),  UUSpy, WinCheat ou encore Windowse permettent de vérifier ces infos.


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#8 13-10-2011 12:20:05

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: [RESOLU] Fonction externe ANSI/UNICODE en PB11

en fait c'est pour recupérer un exe qui tourne en fond et le remettre en plein ecran. Et depuis la migration sous PB11 et en seven ca tourne  plus. Et je pensais que ca venait de la...

sinon je vais essayer avec la fonction wide

Hors ligne

 

#9 13-10-2011 12:32:16

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [RESOLU] Fonction externe ANSI/UNICODE en PB11

bga a écrit:

en fait c'est pour recupérer un exe qui tourne en fond et le remettre en plein ecran. Et depuis la migration sous PB11 et en seven ca tourne  plus. Et je pensais que ca venait de la...

sinon je vais essayer avec la fonction wide

FindWindow retourne quoi comme valeur ?

If the function succeeds, the return value is a handle to the window that has the specified class name and window name.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.

Si c'est un 0, la fenêtre n'a pas été trouvée. Sinon on a un HWND (un handle de fenêtre, normalement un ulong). C'est pour repasser à une fonction système ?

C'est pour chercher quoi ? Une fenêtre de commande en cours d'exécution ? Une appli windows comme la calculette ?


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#10 13-10-2011 13:49:02

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: [RESOLU] Fonction externe ANSI/UNICODE en PB11

en fait on lance un exe puis on le ferme, mais il continu a tourner en fond.
On relance ce meme exe, et pour gagner du temps de lancement, on reactive le premier exe et on quitte le deuxieme... ;-) je sais pas si c'est bien clair. Je n'ai pas encore pu tester car l'appli ne fonctionne pas sur mon poste

Hors ligne

 

#11 14-10-2011 08:57:21

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: [RESOLU] Fonction externe ANSI/UNICODE en PB11

ll_h =  FindWindowA( ls_null ,as_win_title)
IF ll_h > 0 THEN
    // Restaure, affiche et active la fenêtre
    ShowWindow (ll_h, SW_SHOWNORMAL)) -> retourne 0
    SetForegroundWindow (ll_h)) -> retourne 1
end if


ce code devrait me permettre de reactiver une ancienne fenetre mais ca ne fonctionne plus depuis le passage de PB8 en 11!!!!
et je n'ai plus d'idée, au final ca ne semble pas venir de mon FindWindowA!

Hors ligne

 

#12 14-10-2011 10:59:16

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: [RESOLU] Fonction externe ANSI/UNICODE en PB11

en fait je me demande si c'est pas plutot a la fermeture du premier que ca deconne :
sur le close query :
w_mdi.Visible = FALSE
return -1

Hors ligne

 

#13 14-10-2011 12:36:13

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: [RESOLU] Fonction externe ANSI/UNICODE en PB11

j'ai remis a visible = TRUE sur le activate et la ca marche. Donc mon souci n'etait pas un pb de UNICODE.

Merci

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22