| |
Consulter les messages sans réponse | Consulter les sujets actifs
|
Page 1 sur 1
|
[ 6 message(s) ] |
|
| Auteur |
Message |
|
CrAsH0v3r
|
Publié: 07 Juil 2005, 15:59 |
|
 |
| Occasionnel |
 |
Inscription : 03 Juin 2003, 21:27 Message(s) : 165
|
|
Bonjour à tous.
je modifie présentement un programme codé en delphi 5.0.
Dans celui-ci, on enregistre des objets com avec la commande RegisterComServer. Présentement, nous enregistrons les dlls à chaque démarrage de l'application, ce qui cause des ennuis de droits chez certains clients.
Nous voulons donc y remédier en vérifiant auparavant si l'objet est déjà enregistré.
J'ai donc besoin pour vérifier celà, du CLSID de la DLL, ce que je ne possède pas. Je peux aller chercher ça dans les régistres, mais j'ai besoin du nom de la clé, qui est formé du dllname.completename
L'Affaire c'est que j'ai juste le nom et le path de la DLL.
Donc pour faire ça court, j'ai besoin de connaitre le classID d'une DLL, sans rajouter de fonction dans celle-ci et sans avoir les info complète pour aller le chercher dans les régistre.
On a présentement une piste pour contourner le problème, mais on est pas nécessairement avancé, car si ça bloque pour une autre raison, le user en sera pas avertit.
Donc deux choses. Soit je trouve le clsid et voit si la dll est enregistré, soit y'a une facon de savoir si elle l'est sans avoir de clsid.
Si quelqun a une idée là dessus, je vous en serai reconnaissant!
Merci
Philippe
_________________ Intel Pentium 4C 2.80GHz
ASUS P4P800 (i865PE,Audio,Réseau,S-ATA,USB2.0,AGP8X,DUAL DDR)
1024Mo DDR 400Mhz PC-3200 Kingston
Radeon 9600XT 128Mo DDR,Tv-out
80Go Western Digital 7200rpm Serial ATA 8Mo + 60go Maxtor 7200rpm
Boitier X-Blade Blue 450W 3 Fan Écran LCD
Windows XP Pro Fr
|
|
| Haut |
|
 |
|
Jump
|
Publié: 07 Juil 2005, 18:16 |
|
Inscription : 07 Jan 2002, 00:24 Message(s) : 5834
|
la commande (ligne de commande) regsvr32 permet d'enregistrer une fois pour toute une dll.
Tu peux aussi regarder du côté du TypeLib Information Object Library. Petit texte là-dessus ici
_________________ This posting is provided "AS IS" with no warranties, and confers no rights! ©2006 - 2014 Jump
|
|
| Haut |
|
 |
|
CrAsH0v3r
|
Publié: 07 Juil 2005, 21:07 |
|
 |
| Occasionnel |
 |
Inscription : 03 Juin 2003, 21:27 Message(s) : 165
|
|
Merci.
Le problème chez le client, c'est qu'ils lancent le programme une première fois, avec tous les droits administrateurs.
Ensuite, ils vérouillent le poste pour que les utilisateurs n'aient qu'un accès restreint. Le problème qu'on a vient du fait que lorsque le les droits sont restreint, on a plus accès aux régistres, donc la "registration" ne fonctionne plus.
On cherche donc une façon de savoir si la DLL est déjà enregistré, de ne pas le refaire. Puisque dans le cas ou ça ne fonctionne pas, on donne un message à l'usager. En ce moment, il apparait à chaques fois étant donné les droits restreints. Mais en vérifiant si il est déjà enregistré, on pourrait simplement ne pas le réenregistrer, et ainsi ne pas provoquer le message d'erreur.
Cependant, je vais quand même jetter un coup d'oeil à ta doc. Je suis encore junior dans le domaine, mais j'ai l'avis de deux programmeurs expérimenté, qui savent pas trop quoi faire non plus.
Merci!
_________________ Intel Pentium 4C 2.80GHz
ASUS P4P800 (i865PE,Audio,Réseau,S-ATA,USB2.0,AGP8X,DUAL DDR)
1024Mo DDR 400Mhz PC-3200 Kingston
Radeon 9600XT 128Mo DDR,Tv-out
80Go Western Digital 7200rpm Serial ATA 8Mo + 60go Maxtor 7200rpm
Boitier X-Blade Blue 450W 3 Fan Écran LCD
Windows XP Pro Fr
|
|
| Haut |
|
 |
|
Jump
|
Publié: 08 Juil 2005, 00:01 |
|
Inscription : 07 Jan 2002, 00:24 Message(s) : 5834
|
À moins que delphi utilise les dll de manière très particulière, tu ne devrais pas avoir à "enregistrer" les dll lors de chaque utilisation.
Lors de l'installation de l'application, il suffit d'enregistrer de manière permanente les dll en utilisant la commande regsvr32. Après ça le runtime de delphi devrait accéder au registre en lecture uniquement. En tout cas, c'est ce que VB fait.
Au besoin, si une nouvelle version d'une dll ayant un nouveau clsid doit être installée, il est possible de désenregistrer une dll avec le paramètre /u (regsvr32 /u dllname). Ça nettoie le registre.
Pour plus de détails:
http://www.microsoft.com/resources/docu ... svr32.mspx
_________________ This posting is provided "AS IS" with no warranties, and confers no rights! ©2006 - 2014 Jump
|
|
| Haut |
|
 |
|
CrAsH0v3r
|
Publié: 08 Juil 2005, 08:33 |
|
 |
| Occasionnel |
 |
Inscription : 03 Juin 2003, 21:27 Message(s) : 165
|
|
Bon, je vais vérifier ça.
Le programme exister depuis plus de 6 ans, alors que moi je ne suis ici que depuis 6 mois.
Effectivement, on a pas besoin de l'enregistrer chaque fois. Cependant le programme ne possède pas d'installation. Je crois qu'on copie simplement les fichiers dans le répertoire, crée un raccourci et le user commence à l'utiliser. Donc à moins de le faire manuellement, le programme doit le faire lui même.
À la base, il a été codé pour réenregistrer chaque fois(inutilement, mais au cas où se serait la premiere utilisation). À date, tout avait fonctionné, mais un environnement spécial chez un client fait que ça ne peut plus fonctionner comme ça.
Merci de l'idée, je vais proposer!
_________________ Intel Pentium 4C 2.80GHz
ASUS P4P800 (i865PE,Audio,Réseau,S-ATA,USB2.0,AGP8X,DUAL DDR)
1024Mo DDR 400Mhz PC-3200 Kingston
Radeon 9600XT 128Mo DDR,Tv-out
80Go Western Digital 7200rpm Serial ATA 8Mo + 60go Maxtor 7200rpm
Boitier X-Blade Blue 450W 3 Fan Écran LCD
Windows XP Pro Fr
|
|
| Haut |
|
 |
|
CrAsH0v3r
|
Publié: 08 Juil 2005, 11:44 |
|
 |
| Occasionnel |
 |
Inscription : 03 Juin 2003, 21:27 Message(s) : 165
|
|
Problème probablement réglé.
Lorsque les droits utilisateurs sont restreint, l'accès à HKEY_LOCAL_MACHINE\Software\Classes est impossible.
J'ai trouvé une partie de code qui permet de mapper le pointeur sur un autre endroit, en l'occurence HKEY_CURRENT_USER\Software\Classes.
procedure OverrideRegistryKey(Register: boolean);
var
HKCU: HKEY;
ret: integer;
begin
if Register then
begin
RegOpenKeyEx(HKEY_CURRENT_USER, 'Software\Classes', 0, KEY_ALL_ACCESS, HKCU);
try
ret := RegOverridePredefKey(HKEY_CLASSES_ROOT, HKCU);
if ret <> ERROR_SUCCESS then
ShowMessage('Error overriding HKCU:' + #13#10 + SysErrorMessage(ret));
finally
RegCloseKey(HKCU);
end;
end
else
RegOverridePredefKey(HKEY_CLASSES_ROOT, 0);
end;
(Je le post, on sait jamais, ça aidera peut-être quelqun un jour, j'ai passé l'avant-midi à chercher une solution)
Donc ce que ça fait, c'est qu'on se retrouve sur Current_User le temps de l'opération :
OverrideRegistryKey(True);
try
RegisterComServer(Name);
except
ShowMessage('Error registering ' + Name);
end;
OverrideRegistryKey(False);
Donc je n'ai plus de problème d'accès avec les usagers à droits restreints.
Il me reste les principaux tests afin d'être sur que ça fonctionne, et surtout.. vérifier si ça règle le problème du client. Si ça ne le règle pas.. il ambitionne peut-être un peu sur la sécurité!
Et celà est nécessaires, parce que c'est pour enregistrer des plugins. Si le client commande un nouveau plugin, on lui fait, il la met dans son répertoire plugins. Nous au démarrage on prend les dlls du répertoire et on les enregistre. Voilà pourquoi il faut le faire à chaque démarrage.
Merci de l'aide!
_________________ Intel Pentium 4C 2.80GHz
ASUS P4P800 (i865PE,Audio,Réseau,S-ATA,USB2.0,AGP8X,DUAL DDR)
1024Mo DDR 400Mhz PC-3200 Kingston
Radeon 9600XT 128Mo DDR,Tv-out
80Go Western Digital 7200rpm Serial ATA 8Mo + 60go Maxtor 7200rpm
Boitier X-Blade Blue 450W 3 Fan Écran LCD
Windows XP Pro Fr
|
|
| Haut |
|
 |
|
Page 1 sur 1
|
[ 6 message(s) ] |
|
Qui est en ligne ? |
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 5 invité(s) |
|
Vous ne pouvez pas publier de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum
|
|
|
|