Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
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
Bonjour,
De cette manière, peut-être (à tester) :
lb_blob = blob(ls_windowname) // EncodingUTF16LE! is default ls_windownameansi = string(lb_blob, EncodingANSI!)
Hors ligne
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
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)
Hors ligne
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
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
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
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)
Hors ligne
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
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.
Hors ligne
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
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 ?
Hors ligne
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
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
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
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