Exe indépendant

Résolu
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 - 6 nov. 2004 à 17:36
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 - 8 nov. 2004 à 19:55
Salut le forum

C pas vraiment un problème, quoique...

La majeure partie des progs que je développe doivent s'exécuter à partir d'un serveur (exe, bases et autres fichiers sur 1 ou plusieurs serveurs) sans install sur le PC utilisateur, juste un raccourci.

Ces progs se servent de DLL qui ne sont pas toujours présentes sur le PC utilisateur ou pas de la bonne version. Un exemple de fraiche date : des applis VB6 attaquant des bases Access 97 tournaient sans problème avec des PC 98 avec ou sans Access 97 et voilà qu'on a des PC équipés d'XP et Access 2002 et ça marche plus. La DLL fautive était vbar332.dll, présente sous XP/Access2002 mais visiblement pas de la même version. Solution trouvée et qui fonctionne : mettre la DLL, piquée sur les anciens postes, dans le dossier de l'EXE.

Cette solution est valable pour d'autres DLL. Les avantages sont que les DLL du PC ne sont pas écrasées, que ça ne nécessite pas d'inscription dans la bdr donc pas d'install sur le PC mais il faut mettre ces DLL dans le même dossier que l'exe et ça ne fait pas propre.

Mon rêve est d'intégrer directement ces DLL nécessaires au prog dans le prog VB compilé pour en faire un exe indépendant des versions de windows.

Il y a bien les API LoadLibrary et LoadLibrayEx mais ça ne convient pas.
Revenir au C ou à l'ASM ? Je veux bien mais dans ma boite c du VB imposé.

Si un(e) spécialiste avait une idée ?

Cordialement, CanisLupus

12 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
6 nov. 2004 à 17:49
Salut CanisLupus
L'idée serait de créer un 1er EXE qui contiendrait toutes tes DLL dans un fichier de ressources :
Tu le lances, il vérifie si les DLLs existent déjà, sinon, tu les extrais du RS (et tu les enregistres si besoin).
Une fois la vérif faite, tu lances ta véritable application de gestion.
En jouant avec le Command() pour lancer EXE2 par EXE1, tu peux t'assurer que EXE1 est tjrs lancé avant EXE2.

Vala
Jack
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
6 nov. 2004 à 17:54
Ceci est possible dans le même exe si tu fais des références à toute les dll en late-bound, mais alors on y perd beaucoup de rapidité ! Le late-bound étant bien plus lent que l'early-bound !

_______________________________________

DarK Sidious

[Responsable API/VB du site www.ProgOtoP.com]
Téléchargez ProgOtoP API Viewer
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
6 nov. 2004 à 19:02
Et bien en fait, un early-bound consiste à déclarer une référence à ton projet lors de la création. Ainsi, VB peut optimiser toutes les instanciation des objets crée un early-bound puisqu'il sait quand est-ce qu'elles vont être crées, détruites, manipulées, etc. De plus, il peut stocker les informations de l'ocx lors de la compilation.

Par contre, en late-bound, les objets sont crées lors de l'éxécution. Cela est très pratique si tu ne sais pas à l'avance à quelle dll tu va te connecter (cela peut dépendre d'une option de compilation par exemple, ou même d'une entrée de l'utilisateur). Mais à ce moment là, VB ne peux pas optimiser de la même façon l'accès à l'ocx car il n'a pas d'information sur elle : la seule chose qu'il peut connaître à la compilation, c'est le nom de la dll et de la classe à instancier, mais c'est tout !

Pour faire du late-bound, il faut utiliser un CreateObject par exemple, alors qu'avec du early-bound, on peut directement déclarer une variable du type de l'objet contenu dans la dll.

Ton idée du include n'est pas possible en VB à ma connaissance malheureusement, à moins que, avec les fichier incluts au projet, il réussisse à trouver les info qu'il lui faut, comme pour les manifest inclut dans l'exe par exemple, mais j'en suis pas sûr !
_______________________________________

DarK Sidious

[Responsable API/VB du site www.ProgOtoP.com]
Téléchargez ProgOtoP API Viewer
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
6 nov. 2004 à 19:37
re
Pour ajouter un fichier dans un fichier de ressource :
- Dans le menu "Gestionnaire de compléments", ajouter le complément "Editeur de ressources" : une icone "cube vert" apparait dans le toolbar, clique dessus
- Dans la fenêtre de l'éditeur de ressources, clique sur le dernier carré gris coupé en quatre "Ajouter une ressource personnalisée ..."
- Choisis ton fichier (ta DLL)
- Dans la liste, tu as maintenant "CUSTOM" et 101
- Modifie le si tu veux, le principal est de mettre des identifiants que tu utiliseras dans la Sub ci-dessous.

Pour extraire le fichier vers le disque :
J'utilise cette petite Sub que j'utilise pour récupérer le modèle de ma DB originale.
Modifie-la pour avoir le choix des identifiants que tu as déclaré dans la création de la ressource.
Private Sub Ressource_DB(ByVal FichierDB As String)
    ' Ressort la DB originale stockée dans les ressources
    Dim Temp() As Byte, ff As Integer
    ' Récupère la ressource
    Temp = LoadResData(4012, "DB.ORIGINALE")
    ' Vire le fichier si déjà existant
    If Dir(FichierDB) <> "" Then Kill FichierDB
    ' Sauvegarde le fichier
    ff = FreeFile
    Open FichierDB For Binary Access Write As #ff
        Put #ff, , Temp
    Close #ff
End Sub

Vala
Jack
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
7 nov. 2004 à 20:26
En passant :
Récupération (...) du pointer d'une var
Declare Sub CopyPtrFromStruct Lib "kernel32" Alias "RtlMoveMemory" ( _
                    ByVal ptr As Long, _
                    struct As Any, _
                    ByVal cb As Long)
' avec cb = Len(struct)

Declare Sub CopyStructFromString Lib "kernel32" Alias "RtlMoveMemory" ( _
                    dest As Any, _
                    ByVal source As String, _
                    ByVal cb As Long)
' avec cb = Len(dest)

Declare Sub CopyStructFromPtr Lib "kernel32" Alias "RtlMoveMemory" ( _
                    struct As Any, _
                    ByVal ptr As Long, _
                    ByVal cb As Long)
' avec cb = Len(struct)     (supposition)


Donc :
DLLhWnd = LoadLibrary("C:\Rép\Fichier.dll") ' à partir du fichier
MaProcHWnd = GetProcAddress(DLLhWnd, "LeNomDeLaSub")
Mais après, comment s'adresser à MaProc en connaissant son MaProcHWnd ? je n'ai pas trouvé.
-> Voir côté Threads ?
Une fois trouvé, va falloir trouver le moyen de lui transmettre des paramètres. S'il n'y en a qu'un (même complexe sous forme de type défini), je pense qu'on doit pouvoir utiliser une des 3 première déclaration de ce post pour pointer vers ces variables.

A suivre (?)

Vala
Jack
3
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
6 nov. 2004 à 18:00
Bonne idée, jack, mais dans ce cas, comment créer ce 1er exe contenant toutes les DLL ?

Cordialement, CanisLupus
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
6 nov. 2004 à 18:52
late-bound et early-bound, ça ne me parle pas trop.

Juste un exemple :
En C, quand je déclare #include <stdio.h> (ou autre library), je ne suis pas obligé de la fournir avec l'exe, elle est incluse dans l'exe.

J'aimerais faire la même chose en VB. En quelque sorte un #include <toto.dll>

Si ce n'est pas possible, je continuerai avec mes petites astuces pas propres mais qui fonctionnent.

Cordialement, CanisLupus
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
6 nov. 2004 à 19:17
Pour conclure, merci pour ton idée jack que je vais essayer de creuser et merci à DARKSIDIOUS pour tes explications.
Je continue quand même à chercher, des fois que...

Cordialement, CanisLupus
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
6 nov. 2004 à 20:07
Mais jack, en incluant un fichier directement dans le projet (sans passer par des ressources binaire), n'est-il pas possible d'y faire référence sans devoir l'extraire de l'exe ?

Ah, il faudrait qu'EBArtSoft passe par là ! ;)
_______________________________________

DarK Sidious

[Responsable API/VB du site www.ProgOtoP.com]
Téléchargez ProgOtoP API Viewer
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
7 nov. 2004 à 01:26
Oui, tu as raison, c'est faisable avec LoadLibrary : Tu n'as plus qu'à recopier l'objet de la ressource.
Mais, personnellement, je n'ai jamais réussi à dialoguer avec les fonctions qu'elle contient car l'api de dialogue limite à 1 seul paramètre, ce qui n'est pas toujours compatibble avec la fonction de la DLL.
Enfin, moi, c'est comme ça que je l'ai compris et je n'ai pas approfondi la chose.
Si vous avez des infos interessantes la dessus, je suis preneur !
Et rien que le fait d'en parler, ça m'a donné l'idée de revoir ça de plus près. Je viens de m'apercevoir que, une fois la dll en mémoire, ce n'est plus qu'un jeu d'adressage mémoire pour interroger la DLL, donc un AddressOf devrait suffire (voire avec du CallBack ?).
Ca vaut le coup de discutailler !
Je plonge. A plus

Vala
Jack
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
7 nov. 2004 à 13:33
Des infos très intéressantes, je vais plonger aussi à partir de ça car ça m'ouvre des horizons.
C'est ça que je recherche, intégrer dans l'exe et pouvoir s'en servir sans l'extraire.

@+ sur le forum.

Cordialement, CanisLupus
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
8 nov. 2004 à 19:55
Ben, moi, j'ai essayé de passer par un désassembleur pour voir les points d'entrée. Peine perdue car, en cas de modif de l'exe....

Je crois que je vais aller voir du côté du compilateur C pour essayer de comprendre comment il fait. Mais ça risque d'être long. en attendant, je vais continuer à coller les DLL Windows "critiques" dans le dossier de l'exe.

Un grand merci en tous cas à vous qui vous êtes penchés sur le problème. Je garde vos réponses précieusement et vais tenter de les exploiter. Si je trouve une solution je ne manquerai pas de vous en informer.

Merci

Cordialement, CanisLupus
0
Rejoignez-nous