2010-08-02 19 views
0

J'ai un projet de document vx6 activex et j'ai besoin de créer un paquet msi (c'est ce qui est requis car il doit être déployé dans le répertoire actif) qui fonctionne sans interface utilisateur ni intervention de l'utilisateur. J'ai suivi ces étapes:vb6 activex document project silent install

  1. J'ai créé un projet msi en utilisant Visual Studio Installer et j'ai supprimé toutes les interfaces utilisateur. Ajout de tous les fichiers vbd manuellement au projet, compilé. Quand j'exécute le msi, il active tous les fichiers sans les invites, mais l'application ne s'exécute pas.

  2. J'ai créé un package à l'aide de l'assistant de package et de déploiement, puis j'ai ouvert le code source du projet vb pdw, j'ai commenté toutes les boîtes de message, assigné des valeurs par défaut si nécessaire. Puis compilé le fichier setup.exe et copié/écrasé avec le setup.exe sur le paquet d'installation créé plus tôt. Lorsque je l'exécute à partir de l'invite de commande comme ceci 'setup.exe -s install.log' il a installé l'application sans invite, fonctionne bien. Et l'application fonctionne bien après l'installation. J'ai donc décidé de créer un paquet msi en utilisant Visual Studio 2008 et j'ai ajouté le paquet d'installation ci-dessus (en utilisant l'assistant de paquetage et de déploiement). Dans une action personnalisée, j'ai configuré setup.exe pour qu'il s'exécute avec les arguments '-s install.log'. J'ai besoin d'une entrée de registre qui contient le chemin de l'application, donc je l'ai ajouté dans la section des paramètres du registre.

Une autre exigence est que je dois exécuter un autre exe auto-extractible après l'installation. Et cet auto-extracteur va regarder l'entrée de registre ci-dessus et extrait (écrase) le fichier sur le chemin App. Par conséquent, en utilisant l'action personnalisée, j'ai défini le fichier update.exe à exécuter après l'installation. Maintenant, quand je lance le msi, il fonctionne bien, et après l'installation, il exécute update.exe, tout fonctionne bien; mais seulement parfois. Je ne pouvais pas prédire quand ça marche et quand ça ne marche pas. Quand j'ai essayé le même msi sur quelques autres machines, ça a marché sur certains et pas sur d'autres. Et quand j'ai coché 'Ajouter ou supprimer des programmes' il y avait beaucoup d'entrées pour cette application.

J'ai eu du mal avec ce projet msi pendant un moment et maintenant je me sens impuissant. Je ne sais pas ce que je fais mal. J'apprécierais que quelqu'un puisse me diriger dans la bonne direction. Toute autre façon de créer un package d'installation pour le projet de document vx6 activex sans invites?

Répondre

0

Cela fonctionne pour moi en utilisant MSI pour installer un document dll ActiveX:

Cette réponse est un peu en retard, mais j'ai aussi eu du mal avec cela pendant environ un an avant la faire fonctionner. La clé semble être dans l'enregistrement de l'ActiveX exe ​​ou dll lors de l'installation sur un autre PC. Les travaux suivants pour moi; suis seulement étapes d'inscription pour une dll comme toujours ont pas réussi à 100% avec exes:

  1. Créer votre dll ActiveX document (vous pouvez avoir des formes avec dll comme exe)
  2. Utilisez VB Package et déploiement pour rassembler les fichiers nécessaires en un seul endroit. Assurez-vous d'utiliser les fichiers système VB sécurisés (téléchargez un fichier zip [vb6sp6sys.zip] à partir de http://www.jrsoftware.org/iskb.php?vb) à la place de ceux générés par l'assistant Package and Deployment de VB.
  3. Utilisez VB pour créer le petit exécutable (assurez-vous que l'objet de démarrage est Sub Main) illustré ci-dessous dans la section de code. Parce qu'Internet Explorer est le "conteneur" pour votre document ActiveX, ce petit exe utilise une version de celui-ci (IE) pour charger votre UserDocument1.vbd, en fonction de l'OS que vous utilisez. Windows 7 et Vista, je suppose, utilisent une version différente de IE par défaut, ce qui ne semble pas vouloir exécuter un document ActiveX. Mais, dans leur Program Files (x86) il y a une version d'IE qui le fera - d'où le test sur l'existence ou non du dossier (x86); sinon, il suppose qu'il s'agit d'une version inférieure de Windows et s'exécute en utilisant l'IE normal. Appelez ce petit exécutable quelque chose comme "SilentStartUp_ByOS.exe"
  4. Maintenant les mauvaises nouvelles: Vous devez acheter Advanced Installer pour utiliser sa version professionnelle, qui est nécessaire pour extraire les informations d'enregistrement de la bibliothèque native de votre DLL et tout inclus OCXs. Il existe une version gratuite d'Advanced Installer, mais elle n'a pas cette capacité. Remarque: Il peut y avoir d'autres paquets d'installation qui le feront également, mais Advanced Installer est le seul que je connaisse. Je suis un fan d'Inno, mais je n'ai pas pu trouver un moyen de le faire avec Inno.
  5. Inclure tous les fichiers de 2. ci-dessus, avec l'exe créé dans 3. dans votre paquet d'installation. Assignez une icône à l'exe créé en 3. utilisant Advanced Installer et faites-en un raccourci pour démarrer votre programme. Assurez-vous d'installer tout (à l'aide de l'écran Paramètres d'installation) dans AppDataFolder \ AnyFolderNameHere au lieu de ProgramFilesFolder pour contourner les problèmes de sécurité qui sont très strictes sur Win7 et Vista, pour ne pas mentionner si installé sur une entreprise intranet.

Quand tout est fait, parce que votre dll a été enregistré, IE devrait pouvoir pour démarrer votre document ActiveX.

code:

Sub Main() 

Dim strTemp As String 
'ok, it may be Vista or Windows 7... 
strTemp = "C:\Program Files (x86)\Internet Explorer\" 
If CheckFileFolderExists(strTemp, False) = True Then 
    'ok, use older version of IEXPLORE to run this on Win7 (or Vista)... 
    Shell "C:\Program Files (x86)\Internet Explorer\IEXPLORE.EXE " & App.Path & "\UserDocument1.vbd", vbMaximizedFocus 
Else 
    Shell "C:\Program Files\Internet Explorer\IEXPLORE.EXE " & App.Path & "\UserDocument1.vbd", vbMaximizedFocus 
End If 

End Sub 

Function CheckFileFolderExists(strName, fFile) As Boolean 

' The fFile variable determines whether you're 
' looking for a File (True) or Folder(False) 
' The strName variable holds the fully qualified 
' path you're looking for 

Dim fso 
Set fso = CreateObject("Scripting.FileSystemObject") 
    CheckFileFolderExists = False 

    If fFile = True Then ' It's a file 

    If fso.FileExists(strName) = True Then 
     CheckFileFolderExists = True 
     Exit Function 
    End If 

    Else ' It's a folder/directory 

    If fso.FolderExists(strName) = True Then 
     CheckFileFolderExists = True 
     Exit Function 
    End If 

    End If 

    Set fso = Nothing 

End Function