Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Pages: 1
Bonjour à tous,
Petite question :
Est-ce que quelqu'un sait comment récupérer le nom du raccourci sur lequel on a cliqué (pour lancer l'appli) et accéder à ses propriétés ?
Merci d'avance pour votre aide précieuse ^^
Dernière modification par Sebou (10-04-2013 15:00:55)
Hors ligne
Tu cherches à récupérer quoi ? Parce que je pense que les réglages du raccourci influencent le comportement du process mais une fois qu'il a démarré c'est trop tard. Après tu peux avoir certaines infos directement dans PB
- par exemple le "working directory" du racourci c'est le répertoire courant pour le process (GetCurrentDirectory())
- les paramètres de la ligne de command sont accessibles par le paramètre "commandline" de l'évènement open de l'application
Hors ligne
Bonjour Sebou,
pourquoi veux tu faire ça ?
à ma connaissance ce n'est pas possible par contre tu peux récupérer facilement dans l'application le/les éventuels paramètres de lancement (argument commandline dans l'open de l'objet application) ce qui permets de définir des raccourcis de lancement avec des paramètres différents, j'imagine que c'est plus ou moins ton but ?
ex
le raccourci 1 lance "monappli.exe param1"
le raccourci 1 lance "monappli.exe param2"
et tu réagit en fonction de "param1" ou "parm2" (ou rien) reçu en commandline
Edit : Grilled by Seki
Dernière modification par rincevent (03-04-2013 09:43:51)
Hors ligne
rincevent a écrit:
Bonjour Sebou,
pourquoi veux tu faire ça ?
à ma connaissance ce n'est pas possible par contre tu peux récupérer facilement dans l'application le/les éventuels paramètres de lancement (argument commandline dans l'open de l'objet application) ce qui permets de définir des raccourcis de lancement avec des paramètres différents, j'imagine que c'est plus ou moins ton but ?
Le but est le suivant :
L'utilisateur lance une appli développée en PB6 et automatiquement, il faudrait créer un nouveau raccourci au même endroit avec le même nom ( + "nouvelle version " par exemple).
Cela permettrait d'alléger le boulot du service technique pour le passage aux nouvelles versions de nos applis
Hors ligne
Ben avec les fonctions File... (FileCopy, FileOpen, FileWrite etc...) de PB tu peux y arriver non ?
J'imagine que le nom du raccourci est plus ou moins standard non ? (genre le nom du programme)
Hors ligne
rincevent a écrit:
Ben avec les fonctions File... (FileCopy, FileOpen, FileWrite etc...) de PB tu peux y arriver non ?
J'imagine que le nom du raccourci est plus ou moins standard non ? (genre le nom du programme)
Justement pas...On peut avoir plusieurs noms de raccourcis avec différentes "applis" qui s'ouvrent en fonction de certains paramètres.
Quand au FileOpen ou FileCopy, le soucis est que je ne sais pas quel raccourci j'ai lancé :-/
Hors ligne
Ouaip... t'es dans la mouise ^^
sans connaitre toutes les données du problème et toutes les contraintes que tu dois respecter je dirai quand même ceci que je pense depuis le début : il me semble que ce que tu veux faire c'est un peu prendre le problème à l'envers.
Moi je partirai plus vers une appli que tu lances et qui se mets à jour toute seule et que tu lances toujours via le même raccourci que vers la création de nouveaux raccourcis à chauqe MàJ du programme.
Encore une fois celà dit sans connaitre toutes les données du problème et toutes les contraintes que tu dois respecter.
bon courage en tout cas
Hors ligne
Non mais en fait ce n'est pas une histoire de raccourci à créer à chaque MAJ.
Le problème est le suivant : on va déployer des applis en PB12.5 sur les serveurs.
Actuellement, les applis sont en PB 6.5
On souhaite, lors du lancement de l'appli en 6.5 par un utilisateur, lui créer en dynamique un raccourci vers l'appli en 12.5 là où il a le raccourci de la version 6.5
Et tout ça, en automatique pour éviter de passer sur chaque session TSE pour ajouter manuellement le raccourci vers l'appli en 12.5
Bien entendu, on souhaite garder l'appli en 6.5 accessible aussi
C'est plus clair ? ^^
Hors ligne
Tu pourras facilement créer un raccourci (en utilisant un script VBS via OLE dans PB, par exemple).
En revanche pour le placer au même endroit que l'ancien...
Par défaut : sur le bureau ?
Hors ligne
erasorz a écrit:
Tu pourras facilement créer un raccourci (en utilisant un script VBS via OLE dans PB, par exemple).
En revanche pour le placer au même endroit que l'ancien...
Par défaut : sur le bureau ?
Par défaut sur le bureau oui...(facile ça). Mais certains regroupent toutes les applis de la boite dans un répertoire pour éviter d'avoir 10 000 icônes sur le bureau (oui oui, nous sommes des fous : 10 000 applis mdr)
Hors ligne
Donc à part faire une recherche sur le disque, je ne vois pas trop...
Hors ligne
Bon alors, je creuse un peu plus :
Dans les propriétés du raccourci, dans l'onglet "Détail", il y a toutes les infos dont j'ai besoin.
Comment je peux y accéder ?
Et j'ai toujours le problème de savoir quel raccourci j'ai lancé ?
Au passage, rincevent et seki, vous êtes sûr ? Car j'ai une erreur...Vous ne confondez pas avec CommandParm() ? (qui elle me donne le fichier .ini passé en paramètre)
Dernière modification par Sebou (04-04-2013 08:43:23)
Hors ligne
Sebou a écrit:
Bon alors, je creuse un peu plus :
Dans les propriétés du raccourci, dans l'onglet "Détail", il y a toutes les infos dont j'ai besoin.
Comment je peux y accéder ?
En combinant WScript.Shell ( http://www.rgagnon.com/pbdetails/pb-0125.html ) et ce genre de script (ici ça change les propriétés du raccourci) :
Set Shell = CreateObject("WScript.Shell") DesktopPath = Shell.SpecialFolders("Desktop") Set link = Shell.CreateShortcut(DesktopPath & "\winipcfg.lnk") link.Arguments = "" link.Description = "winipcfg shortcut" link.HotKey = "CTRL+ALT+SHIFT+X" link.IconLocation = ",0" link.TargetPath = "c:\windows\winipcfg.exe" link.WindowStyle = 1 link.WorkingDirectory = "d:\test" link.Save
Sebou a écrit:
Et j'ai toujours le problème de savoir quel raccourci j'ai lancé ?
Ça je pense que tu ne pourras pas le savoir...
Sebou a écrit:
Au passage, rincevent et seki, vous êtes sûr ? Car j'ai une erreur...Vous ne confondez pas avec CommandParm() ? (qui elle me donne le fichier .ini passé en paramètre)
Je pense que commandline n'existait pas en PB6.5.
Hors ligne
erasorz a écrit:
Sebou a écrit:
Au passage, rincevent et seki, vous êtes sûr ? Car j'ai une erreur...Vous ne confondez pas avec CommandParm() ? (qui elle me donne le fichier .ini passé en paramètre)
Je pense que commandline n'existait pas en PB6.5.
PB 6.5 build 444
event open de l'objet application, argument "commandline"
chez moi il existe en tout cas
Hors ligne
rincevent a écrit:
PB 6.5 build 444
event open de l'objet application, argument "commandline"
chez moi il existe en tout cas
oups
en même temps j'ai jamais utilisé PB6.5
Hors ligne
rincevent a écrit:
erasorz a écrit:
Sebou a écrit:
Au passage, rincevent et seki, vous êtes sûr ? Car j'ai une erreur...Vous ne confondez pas avec CommandParm() ? (qui elle me donne le fichier .ini passé en paramètre)
Je pense que commandline n'existait pas en PB6.5.
PB 6.5 build 444
event open de l'objet application, argument "commandline"
chez moi il existe en tout cas
Oups j'ai fait le boulet !!
Effectivement commandline existe mais ça ne m'avance pas.
J'ai une autre piste : on pourrait parcourir le répertoire de l'utilisateur, chercher tous les .lnk
Aller lire les propriétés pour récupérer là où il pointe. Ainsi on finirait par récupérer le raccourci qu'on a lancé...
Affaire à suivre
Hors ligne
Il y a une solution : l'api permet de savoir si on a été démarré par un .lnk avec GetStartupInfo mais je n'ai pas encore réussi à l'utiliser dans PB (ça plante lors de l'appel, je suppose que je ne remplis pas bien la structure STARTUPINFO qui est utilisée.
En gros : GetStartupInfo permet de savoir dans quel contexte on a été démarré, et de récupérer la position, l'aspect demandé (maximisé, iconisé, ... et un tas d'autre truc). Si le champ dwFlag a le bit STARTF_TITLEISLINKNAME, le champ lpTitle n'est pas le titre de la fenêtre mais le .lnk que cherche Sebou
Plus qu'à faire tomber le truc en marche
Hors ligne
Il faudrait peut-être se demander si l'investissement en temps nécessaire pour faire tout ça est bien justifié (en prenant en compte les éventuelles erreurs/problèmes que ça va causer sur certains postes) ou si une simple création du nouveau raccourci sur le bureau (quitte à ce que l'utilisateur déplace le raccourci après) serait suffisant non ?
Hors ligne
Pour ce que ça vaut, et pour l'intérêt de relever le défi j'ai réussi à le faire fonctionner
J'utilise une fonction outil annexe pour le calcul de bit, ça pourrait sans doute s'écrire autrement, mais il y a un simple bit à tester :
global type bitwiseand from function_object end type forward prototypes global function unsignedlong bitwiseand (unsignedlong aul_value1, unsignedlong aul_value2) end prototypes global function unsignedlong bitwiseand (unsignedlong aul_value1, unsignedlong aul_value2); // Function: bitwiseand (UnsignedLong aul_value1,UnsignedLong aul_value2) // Description: ANDs each bit of the values. this is an iterative function. // al_Value1 The first value to be used in the operation. // al_Value2 The second value to be used in the operation. // Returns: UnsignedLong The result of the AND operation. // Author: Lijun Yang Date: 4/8/97 UnsignedLong lul_return = 0 Unsignedlong lul_multiple = 1 Unsignedlong ll_Result // Check for nulls If IsNull(aul_Value1) Or IsNull(aul_Value2) Then SetNull(ll_Result) Return ll_Result End If // Perform the AND Do lul_return += mod (aul_value1, 2) * mod (aul_value2, 2) * lul_multiple aul_value1 = aul_value1 / 2 aul_value2 = aul_value2 / 2 lul_multiple *= 2 Loop Until aul_value1 = 0 AND aul_value2 = 0 Return lul_return end function
La fonction elle même (en utilisant certaines possibilités de pb non documentées mais bien pratiques : la fonction inclut le prototype d'external et la structure qui sert à appeler GetStartupInfo)
forward global type getstartinfo from function_object end type global type st_startupinfo from structure end type end forward global type st_startupinfo from structure ulong cb ulong lpreserved ulong lpdesktop ulong lptitle ulong dwx ulong dwy ulong dwxsize ulong dwysize ulong dwxcountchars ulong dwycountchars ulong dwfillattribute ulong dwflags integer wshowwindow integer cbreserved2 ulong lpreserved2 ulong hstdinput ulong hstdoutput ulong hstderror end type global type getstartinfo from function_object end type type prototypes subroutine GetStartupInfo(ref st_startupinfo stinfo) library "kernel32.dll" alias for "GetStartupInfoW" //if PB < 10, use this one : subroutine GetStartupInfo(ref st_startupinfo stinfo) library "kernel32.dll" alias for "GetStartupInfoA;Ansi" end prototypes forward prototypes global function string getstartinfo () end prototypes global function string getstartinfo (); // Call the system api GetStartupInfo // to know if the process was called directly in explorer // or via a shortcut (.lnk) // // (c) 2013 - Sébastien Kirche string ls_ret, ls_temp st_startupinfo lstr_startup_info blob lb_temp constant int STARTF_TITLEISLINKNAME = 2048//0x800 lstr_startup_info.cb = 68 //fill the structure getstartupinfo(ref lstr_startup_info) ls_temp = string(lstr_startup_info.lpTitle, "address") //these 2 lines can convert the LPSTR filled by GetStartupInfoA //and we are PB 10+ //lb_temp = blob(ls_temp) //ls_temp = string(lb_temp, encodingansi!) if bitwiseand(lstr_startup_info.dwFlags, STARTF_TITLEISLINKNAME) > 0 then ls_ret = "start from link = " + ls_temp else ls_ret = "started directly : " + ls_temp end if return ls_ret end function
La fonction pourra être modifiée au niveau de la chaîne retournée, moi j'ai indiqué explicitement si l'application est démarrée vie un raccourci ou directement pour mes tests.
rincevent a écrit:
Il faudrait peut-être se demander si l'investissement en temps nécessaire pour faire tout ça est bien justifié
Bon, j'ai juste relevé le défi de la récupération du .lnk si besoin. À Sebou de voir ce qu'il peut faire de l'information
Hors ligne
seki a écrit:
rincevent a écrit:
Il faudrait peut-être se demander si l'investissement en temps nécessaire pour faire tout ça est bien justifié
Bon, j'ai juste relevé le défi de la récupération du .lnk si besoin. À Sebou de voir ce qu'il peut faire de l'information
Tout à fait, c'était juste une remarque en passant et par rapport à une expérience personnelle similaire qui a un peu mal tourné ^^
Parfois le mieux est l'ennemi du bien, surtout si il faut commencer à utiliser des trucs non documentés ou non supportés qui le plus souvent fonctionnent sans problèmes sur la machine du développeur mais plantent sur les machines des users.
Pis si en plus faut mettre du code Copyrighté par Sébastien Kirche alors là c'est encore pire ( )
Hors ligne
Merci seki ^^
Je m'occupe de cela dans l'aprem et je vous tiens au jus de ce que ça donne
Hors ligne
rincevent a écrit:
Parfois le mieux est l'ennemi du bien, surtout si il faut commencer à utiliser des trucs non documentés ou non supportés qui le plus souvent fonctionnent sans problèmes sur la machine du développeur mais plantent sur les machines des users.
Tu parles de la syntaxe que j'utilise pour ma fonction globale, que l'IDE ne te laisse pas faire mais que PB supporte ? C'est juste pour simplifier la publication du code sur le forum.
Normalement:
- l'IDE ne permet pas de déclarer de "local external" pour une fonction globale => il faudrait la déclarer en "global external" dans l'objet application
- on ne peut pas déclarer de structure dans une fonction correctif : ah si on peut
Il faut savoir que window, userobject, fonction globale et structure sont tous des objets pour PB et qu'il est possible d'utiliser la même syntaxe pour utiliser les mêmes possibilités, même si l'IDE ne le laisse pas faire ou ne le supporte pas toujours. Comme le coup de la local external dans la fonction.
Par contre je sais ajouter un constructeur ou un destructeur dans une structure (qui fonctionnent, messagebox à l'appui !) mais ça n'est possible qu'en "edit source" et lorsqu'on réouvre le code code, l'IDE "nettoie" du code qui n'est pas censé se trouver. Mais ça pourrait être intéressant en utilisant un IDE externe à PB...
Il faudra qu'un jour j'ouvre un sujet sur les trucs tordus qu'on peut faire en PB...
rincevent a écrit:
Pis si en plus faut mettre du code Copyrighté par Sébastien Kirche alors là c'est encore pire ( )
Boaf c'est juste une habitude que j'ai de dater le code, maintenant pour un bout de code public comme celui-là ça n'a pas beaucoup d'intérêt...
Hors ligne
Sebou a écrit:
Actuellement, les applis sont en PB 6.5
J'ai "zappé" ce point. Aussi dans mon code
type prototypes subroutine GetStartupInfo(ref st_startupinfo stinfo) library "kernel32.dll" alias for "GetStartupInfoW" //if PB < 10, use this one : subroutine GetStartupInfo(ref st_startupinfo stinfo) library "kernel32.dll" alias for "GetStartupInfoA;Ansi" end prototypes
L'appel à GetStartupInfoW peut fonctionner, mais dans la structure se trouveront alors des pointeurs vers des chaînes unicode que PB 6.5 ne saura pas exploiter.
Il faudrait plutôt utiliser la 2e déclaration de fonction, en supprimant la partie ";ansi" dans l'alias.
Edit: je viens de vérifier que ça fonctionne comme je dis avec PB9, je n'ai pas plus vieux ici pour tester sur du 6.5 mais on peut être confiant
Dernière modification par seki (04-04-2013 15:25:49)
Hors ligne
Je confirme que ca fonctionne en PB6.5.
J'ai pu tester rapidement...Demain je m’attelle à la seconde phase ^^
Hors ligne
seki a écrit:
Tu parles de la syntaxe que j'utilise pour ma fonction globale, que l'IDE ne te laisse pas faire mais que PB supporte ?
Je réagissais à ton
seki a écrit:
en utilisant certaines possibilités de pb non documentées mais bien pratiques
mais faut pas le prendre comme une critique hein, d'où les smileys.
Hors ligne
Pages: 1