Nous sommes actuellement le 01 Juil 2026, 15:06

Le fuseau horaire est UTC-5 heures [Heure d’été]




Publier un nouveau sujet Répondre au sujet  [ 6 message(s) ] 
Auteur Message
 Sujet du message: Objet COM et CLSID ( DELPHI )
MessagePublié: 07 Juil 2005, 15:59 
Hors-ligne
Occasionnel
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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 07 Juil 2005, 18:16 
Hors-ligne
Référence
Référence
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 07 Juil 2005, 21:07 
Hors-ligne
Occasionnel
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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 08 Juil 2005, 00:01 
Hors-ligne
Référence
Référence
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 08 Juil 2005, 08:33 
Hors-ligne
Occasionnel
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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 08 Juil 2005, 11:44 
Hors-ligne
Occasionnel
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
 Profil  
Répondre en citant  
Afficher les messages publiés depuis :  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 6 message(s) ] 

Le fuseau horaire est UTC-5 heures [Heure d’été]


Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité


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

Recherche de:
Aller vers :  
cron
Propulsé par phpBB® Forum Software © phpBB Group
Traduction et support en françaisHébergement de site