IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Outils Delphi Discussion :

[InnoSetup] - appel à une fonction d'une dll


Sujet :

Outils Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 29
    Points
    29
    Par défaut [InnoSetup] - appel à une fonction d'une dll
    Bonjour,

    J'utilise InnoSetup pour créer un exécutable, et dans le script, je fais appel à une fonction d'une dll.

    Voici mon code, qui appelle la fonction "FonctionDansLaDll", définie dans MaDll.dll :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    resultat: Integer;
    Function MaFonction(Param1 : String; Param2 : String) : Integer;
    var
     obj: Variant;
     s : String;
     
    begin
     //Starting
     ExtractTemporaryFile('MaDll.dll');
     
     obj := CreateOleObject('MonNamespace.MaClasse');
     
     //Using
     resultat := obj.FonctionDansLaDll(Param1, Param2);
     
     //Finishing
     DeleteFile('{tmp}\MaDll.dll');
    end;
    Ce code fonctionne nickel sur le pc sur lequel je développe, la fonction est bien appelée, et renvoie le résultat attendu, mais quand je le teste sur un autre pc (genre chez le client ), suite au CreateOleObject, j'ai le message d'erreur suivant :

    Runtim error (at 1:116): Invalid class string
    Quelqu'un aurait-il une idée? Pourquoi ça fonctionne sur le pc de dèv et pas sur un autre?

    Merci d'avance!!!

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Faudrait faire un RegSvr32 de ta DLL pour que l'Objet COM que tu utilises puisse être associé avec le son nom de Classe, son GUID et sa DLL
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    Je ne trouve pas la fonction RegServer32 en pascal, je peux utiliser "RegisterServer"?

    Je dois faire cet appel dans ma fonction pour la dll temporaire, ou bien avant cette fonction, pour la dll "réelle"?

    Merci pour vos réponses rapides, ça fait plaisir

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    alors, dans mon script, au début de MaFonction, je fais cet appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RegisterServer(false, 'MaDll.dll', true); // 1er param à false pour 32-bits
    mais il me jette à l'exécution :

    RegSrv32 failed with exit code 0x3
    A ce que j'ai vu, c'est pour me dire que le path n'est pas bon...
    J'ai fait le même essai avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    s : String;
     
     ExtractTemporaryFile('MaDll.dll');
     s := ExpandConstant('{tmp}') + 'MaDll.dll';
    RegisterServer(false, s, true); // 1er param à false pour 32-bits
    avec le même résultat...

    je sèche là

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    ok alors autre test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ExtractTemporaryFile('MaDll.dll');
     s := ExpandConstant('{tmp}\MaDll.dll');
     
     Exec('regsvr32.exe', s, '', SW_SHOW,
         ewWaitUntilTerminated, ResultCode);
    Et là, je me fait jeter encore :

    "La dll MaDll.dll a été chargée, mais le point d'entrée DllRegisterServer est introuvable"

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Ta DLL c'est une Bibliothèque ActiveX ou une Assembly .Net (RegAsm dans ce cas)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    ma dll est développée en c#, donc ce n'est pas une Assembly .Net si j'ai bien compris ta question...

    d'après ce que je vois sur le net, il faut que je déclare les fonctions "DllRegisterServer" et "DllUnregisterServer" dans ma dll, c'est bien ça?

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Si c'est C#, c'est une Assembly !
    Tu devrais te renseigner à ce sujet !
    Donc RegAsm.exe pour la déployer !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    oui, j'ai vu ça entre temps
    merci pour l'info

    alors pas mieux, donc, ça a l'air de bien enregistrer la dll, pas de souci de point d'entrée, mais toujours bon vilain message d'erreur :

    Runtime error : invalid class string


    c'est moi ou je tourne en rond?

  10. #10
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 29
    Points
    29
    Par défaut


    autant pour moi, en fait ma ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exec('regasm.exe', s, '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
    me renvoie le resultat 2, ce qui correspond à :
    fichier introuvable
    bah c'est fou ça

    et pourquoi de toute façon ça fonctionne sur mon pc de dev alors que je ne fais pas cet enregistrement de ma dll?

  11. #11
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    Bonjour,

    quelques infos supplémentaires, je suis toujours bloquée sur le même problème...

    en fait, dans mon code, c'est l'appel à la fonction
    CreateOleObject
    qui me pose problème...

    En effet, j'extrais ma dll dans le répertoire temporaire en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExtractTemporaryFile('MaDll.dll');
    ce qui fonctionne bien, puisque je trouve MaDll à l'endroit indiqué.

    Mais si je supprime la dll de l'endroit où je l'ai compilé (ou que je la renomme), quand je fais appel à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CreateOleObject('MonNamespace.MaClasse');
    j'ai une erreur me disant que :
    le fichier spécifié est introuvable


    alors j'ai cherché sur le net, et je ne vois pas comment dire à cette fonction CreateOleObject d'aller lire la dll temporaire, et je ne comprend pas comment elle trouve le path pour aller lire la dll d'origine...
    ?

    Quelqu'un aurait une piste?

    Bonne journée à tous!

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Tu ne peux pas utiliser une Assembly sans l'enregistrer !

    es-tu le développeur de la DLL ?
    Si oui, c'est VS.Net qui enregistrer la DLL pour toi
    Si non, il n'y aurait pas un setup qui accompagne la DLL ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #13
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    le fait de faire appel à regasm.exe ne permet pas d'enregistrer ma dll?

    sinon, non je ne suis pas développeur de cette dll, elle m'a été fournie, et je dois aller taper dedans pour faire appel à MaFonction, c'est tout...

    et je n'ai pas setup qui l'accompagne, juste la dll...

    je viens de voir qu'avec InstallShield, l'équivalent de CreateOleObject est une fonction qui prend non pas un, mais deux paramètres en entrée, et le 1er est le path de la dll... ce qui est très explicite du coup.

    et je ne vois pas comment faire ça avec Inno Setup... je ne comprend pas comment fonctionne l'appel à CreateOleObject, en particulier comment il trouve la dll dans laquelle aller taper...
    j'en suis à me demander si c'est seulement possible de faire ce que je veux

  14. #14
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    aaaaaaaaaaaaaaaaaaaahhhhh (cri du coeur, p****n de fait technique)

    ça y est, ça marche

    alors, je vais quand même détailler ici ce que j'ai fait, parce que vu le temps que j'ai passé à galérer (comment ça InnoSetup c'est vraiment pas beaucoup documenté?? , je me dis que ça pourra pitêtre servir à quelqu'un d'autre

    On reprend donc le contexte :
    à partir de mon script InnoSetup, je dois faire appel une fonction contenue dans une dll (C#).

    Voilà ce que ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var s : String;
     
    ExtractTemporaryFile('MaDll.dll');  // j'extrais ma dll dans un dossier temp
    s := '/codebase ' + ExpandConstant('{tmp}')+'\MaDll.dll';
     
    Exec('regasm.exe', s, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);  
    // j'enregistre ma dll grâce à regasm (car c'est une dll c#), 
    // et je met l'option /codebase, parce que je veux que le path
    // temporaire soit stocké dans la base de registre
    Et voilà, SAUF... sauf que, ATTENTION, ceci ne fonctionne que si :
    • le framework DotNet est installé sur la machine cible (c:\windows\Microsoft.Net\Framework)

      ET
    • si le chemin vers ce framework est enregistré dans la variable d'environnement "PATH"...

    voili, voilou, et à toi ShaiLeTroll !

  15. #15
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 418
    Points
    1 418
    Par défaut
    Après utilisation tu la dé enregistre avec /u ?
    Et elle est bien effacé elle ne reste pas dans le dossier temp ?

    Je ne connais pas c# alors pas taper si je dis une bêtise
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  16. #16
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    Salut ouiouioui,

    Non je ne désenregistre pas ma dll, a priori pas besoin, dans l'aide d'InnoSetup pour la fonction ExtractTemporaryFile que j'utilise :
    The extracted files are automatically deleted when Setup exits.
    Donc tout est fait proprement

    D'ailleurs, si tu stoppes l'exécution du .iss en cours, tu peux voir le dossier temp, et la dll extraite dedans, alors qu'une fois que l'exécution est terminée, le dossier créé sous temp, et dans lequel il y avait la dll, ce dossier n'existe plus...

  17. #17
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 695
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    Et les inscriptions faites dans la base des registres ???

  18. #18
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 29
    Points
    29
    Par défaut


    autant pour moi, je n'avais pas vérifié ce point...

    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ExtractTemporaryFile('MaDll.dll');
     s := '/codebase ' + ExpandConstant('{tmp}')+'\MaDll.dll';
     
     // on enregistre la dll pour pouvoir l'utiliser
     Exec('regasm.exe', s, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
     
     // ...
     // on utilise les fonctions de la dll
     // ...
     
     // puis on désenregistre la dll
     s := '/unregister ' + ExpandConstant('{tmp}')+'\MaDll.dll';
     Exec('regasm.exe', s, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
    Merci pour cette précision Andnotor

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. Réponses: 6
    Dernier message: 02/11/2011, 09h34
  3. Réponses: 1
    Dernier message: 25/10/2007, 18h04
  4. Appeler une fonction dans une fonction
    Par bryanstaubin dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 18/06/2007, 09h39
  5. Réponses: 4
    Dernier message: 17/03/2004, 17h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo