User Tag List

Results 1 to 10 of 10

Thread: Déploiement d'extensions avec CRT en DLL

  1. #1
    Clicker Fusion 2.5 DeveloperInstall Creator Pro

    Join Date
    Sep 2006
    Posts
    517
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Déploiement d'extensions avec CRT en DLL

    Les bibliothèques standard C (C Run-Time Libraries) fournies par Microsoft Visual C++ peuvent être liées dynamiquement ou statiquement. Lorsque elles sont liées dynamiquement, le fichier de la DLL devrait être fourni avec l'application. Pour faciliter la tâche aux utilisateurs de l'extension, le SDK de MMF permet de gérer ce genre de dépendance.

    Dans le fichier <span style="font-weight: bold">General.cpp</span> remplacez :

    <div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>// ----------------------------------------------------------
    // GetDependencies
    // ----------------------------------------------------------
    // Returns the name of the external modules that you wish MMF to include
    // with stand-alone applications (these modules must be in the MMF
    // Data\Runtime folder).
    //

    //LPCSTR szDep[] = {
    // &quot;MyDll.dll&quot;,
    // NULL
    //};

    LPCSTR* WINAPI DLLExport GetDependencies()
    {
    return NULL; // szDep;
    }</pre></div></div>

    par (ATTENTION : suivant la version de Visual C++ et les options choisies pour l'édition de liens, la DLL employée par l'extension n'est pas toujours msvcr80.dll) :

    <div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>
    // ----------------------------------------------------------
    // GetDependencies
    // ----------------------------------------------------------
    // Returns the name of the external modules that you wish MMF to include
    // with stand-alone applications (these modules must be in the MMF
    // Data\Runtime folder).
    //

    LPCSTR szDep[] = {
    &quot;msvcr80.dll&quot;, /* VS C++ 2005, option /MD */
    NULL
    };

    LPCSTR* WINAPI DLLExport GetDependencies()
    {
    return szDep;
    }</pre></div></div>

    Lors de l'installation de l'extension, ajoutez la DLL dans le dossier <span style="font-weight: bold">Data\Runtime</span> de MMF et c'est terminé. Maintenant cette DLL sera automatiquement ajoutée aux applications utilisant votre extension.

    ouly

    Liens utiles :
    <ul style="list-style-type: disc">[*]Redistribution of the shared C runtime component in Visual C++[*]C Run-Time Libraries[*]Linking Statically vs Linking Dynamically[/list]

    Note : la redistribution de la DLL sous cette forme a l'avantage de ne pas nécessiter d'accès administrateur pour le déploiement de l'application sur le poste client et est compatible avec les Windows plus anciens.

  2. #2
    Clickteam Clickteam

    Join Date
    Jun 2006
    Location
    France
    Posts
    14,022
    Mentioned
    279 Post(s)
    Tagged
    3 Thread(s)

    Re: Déploiement d'extensions avec CRT en DLL

    Il n'y a souvent aucun intérêt à linker dynamiquement une extension si on doit redistribuer la DLL, car le link static n'incluera que les routines nécessaires, alors que la DLL les contient toutes (d'où perte de place). Le seul cas où c'est intéressant c'est lorsque qu'on installe plusieurs DLL ou EXE utilisant cette DLL en commun.

    Par ailleurs l'utilisation des classes C++ de la runtime library comme vector ou string nécessite la redistribution d'une autre DLL : msvcp80.dll pour VC 2005, msvcp90.dll pour VC 2008, etc.

  3. #3
    Clicker Fusion 2.5 DeveloperInstall Creator Pro

    Join Date
    Sep 2006
    Posts
    517
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Re: Déploiement d'extensions avec CRT en DLL

    Actuellement je ne sais pas trop qu'en penser... Il est vrai que, vu la taille de la DLL (~ 650 Ko), les applications contenant peu d'extensions vont gagner du poids.

    Mais la question se pose plutôt pour faire collaborer plusieurs extensions ensemble. J'ai toujours été allergique aux extensions qui reproduisent des fonctionnalités existantes dans d'autres extensions. Prenons l'exemple de l'écriture/lecture de fichiers, l'accès direct au fichier proposé par la plupart des extensions ne permet pas de jouer sur les données (compression, chiffrement, groupement, signature, transmission par le réseau, etc.). On peut évidemment utiliser un fichier temporaire mais ce n'est pas très propre. Bon dans le cas présent que les tas (heap) des CRT soient différents ne posent pas excessivement problème tant que les allocations/désallocations restent localisées et qu'il n'y a que des accès mémoire depuis l'extérieur.

    Enfin c'est une question philosophique et pratique, je verrais avec le temps. Ce qui est surtout intéressant ici est qu'il est possible de lier statiquement ou dynamiquement sans que l'utilisateur de l'extension et l'utilisateur de l'application ne voient de différence (excepté le poids de l'application).

  4. #4
    Clicker Fusion 2.5 DeveloperInstall Creator Pro

    Join Date
    Sep 2006
    Posts
    517
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Re: Déploiement d'extensions avec CRT en DLL

    Lorsqu'un projet VS C++ est compilé avec l'option <span style="font-weight: bold">/MD</span>, le symbole <span style="font-weight: bold">_DLL</span> est défini*. Petite correction du code pour avoir quelque chose de plus propre :

    <div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>// ----------------------------------------------------------
    // GetDependencies
    // ----------------------------------------------------------
    // Returns the name of the external modules that you wish MMF to include
    // with stand-alone applications (these modules must be in the MMF
    // Data\Runtime folder).
    //

    #ifdef _DLL
    #pragma message(&quot;NOTICE: msvrct80.dll needed!&quot
    LPCSTR szDep[] = {
    &quot;msvcr80.dll&quot;, /* VS C++ 2005, option /MD */
    NULL
    };
    #endif

    LPCSTR* WINAPI DLLExport GetDependencies()
    {
    #ifdef _DLL
    return szDep;
    #else
    return NULL;
    #endif
    }</pre></div></div>

    * voir : http://msdn.microsoft.com/fr-fr/library/2kzt1wy3.aspx

  5. #5
    Clickteam Clickteam

    Join Date
    Jun 2006
    Location
    France
    Posts
    14,022
    Mentioned
    279 Post(s)
    Tagged
    3 Thread(s)

    Re: Déploiement d'extensions avec CRT en DLL

    Bonne idée.

    Pour avoir un truc encore plus propre il faudrait :

    - tester les différentes versions de VC (sauf la 6 car msvcrt.dll est toujours incluse dans Windows) et inclure la DLL correspondante à chaque version.

    - ajouter une option à définir pour inclure aussi les autres DLLs nécessaires en cas d'utilisation des templates C++ de la librairie runtime (msvcpXX.dll).

  6. #6
    Clicker Fusion 2.5 DeveloperInstall Creator Pro

    Join Date
    Sep 2006
    Posts
    517
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Re: Déploiement d'extensions avec CRT en DLL

    Oui tout-à-fait. Je regarderai ceci dès que j'ai un peu de temps mais ce ne sera probablement pas avant les vacances de février.

  7. #7
    Clicker Fusion 2.5 DeveloperInstall Creator Pro

    Join Date
    Sep 2006
    Posts
    517
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Re: Déploiement d'extensions avec CRT en DLL

    Vacances bien chargées pour l'instant. Je regarde tout de même ceci dès que je peux.

  8. #8
    Clicker Fusion 2.5 DeveloperInstall Creator Pro

    Join Date
    Sep 2006
    Posts
    517
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Re: Déploiement d'extensions avec CRT en DLL

    J'ai regardé pour l'instant s'il était possible d'automatiser la génération des dépendances.

    Il ne semble pas qu'il soit possible cette génération des dépendances avec seulement du code C. MS VC++ indique au moment de la compilation si l'édition de liens est paramétrée pour être statique ou dynamique et ceci pour les librairies (C, C++ et MFC) mais n'indique pas s'il y a une dépendance effective (en tout cas pas à ma connaissance).

    Je vais donc m'en tenir à ta proposition, Yves.

  9. #9
    Clicker Fusion 2.5 DeveloperInstall Creator Pro

    Join Date
    Sep 2006
    Posts
    517
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Re: Déploiement d'extensions avec CRT en DLL

    Ok, voici une base. Je vérifierai ce week-end qu'il n'y a pas d'erreur de syntaxe.

    <div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>LPCSTR szDep[] = {

    #ifndef _VC_NODEFAULTLIB
    #ifdef _DLL

    #if _MSC_VER == 1600 /* MS VS 2010 */
    #pragma message(&quot;NOTICE: msvcr100.dll needed!&quot
    &quot;msvcr100.dll&quot;,
    #elseif _MSC_VER == 1500 /* MS VS 2008 */
    #pragma message(&quot;NOTICE: msvcr90.dll needed!&quot
    &quot;msvcr90.dll&quot;,
    #elseif _MSC_VER == 1400 /* MS VS 2005 */
    #pragma message(&quot;NOTICE: msvcr80.dll needed!&quot
    &quot;msvcr80.dll&quot;,
    #elseif _MSC_VER == 1310 /* MS VS 2003 */
    #pragma message(&quot;NOTICE: msvcr71.dll needed!&quot
    &quot;msvcr71.dll&quot;,
    #elseif _MSC_VER == 1300 /* MS VS 2002 */
    #pragma message(&quot;NOTICE: msvcr70.dll needed!&quot
    &quot;msvcr70.dll&quot;,
    #elseif _MSC_VER == 1200 /* MS VS 6 */
    /* Nothing needed */
    #else
    #error Cannot resolve STDLIB dependency
    #endif

    #ifdef MMFEXT_USE_CPPLIB
    #if _MSC_VER == 1600 /* MS VS 2010 */
    #pragma message(&quot;NOTICE: msvcp100.dll needed!&quot
    &quot;msvcp100.dll&quot;,
    #elseif _MSC_VER == 1500 /* MS VS 2008 */
    #pragma message(&quot;NOTICE: msvcp90.dll needed!&quot
    &quot;msvcp90.dll&quot;,
    #elseif _MSC_VER == 1400 /* MS VS 2005 */
    #pragma message(&quot;NOTICE: msvcp80.dll needed!&quot
    &quot;msvcp80.dll&quot;,
    #elseif _MSC_VER == 1310 /* MS VS 2003 */
    #pragma message(&quot;NOTICE: msvct71.dll needed!&quot
    &quot;msvcp71.dll&quot;,
    #elseif _MSC_VER == 1300 /* MS VS 2002 */
    #pragma message(&quot;NOTICE: msvcp70.dll needed!&quot
    &quot;msvcp70.dll&quot;,
    #elseif _MSC_VER == 1200 /* MS VS 6 */
    #pragma message(&quot;NOTICE: msvcp60.dll needed!&quot
    &quot;msvcp60.dll&quot;,
    #else
    #error Cannot resolve CPPLIB dependency
    #endif
    #endif /* MMFEXT_USE_CPPLIB */

    #endif /* _DLL */
    #endif /* _VC_NODEFAULTLIB */

    #ifdef /* _AFLL */
    /* TODO: MFC DLL, ANSI or Unicode version */
    #endif /* _AFLL */

    NULL /* Last item! */
    };

    LPCSTR* WINAPI DLLExport GetDependencies()
    {
    return szDep;
    }</pre></div></div>

  10. #10
    Clicker Fusion 2.5 DeveloperInstall Creator Pro

    Join Date
    Sep 2006
    Posts
    517
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Re: Déploiement d'extensions avec CRT en DLL

    Voici le résultat final avec quelques explications.

    Dans la documentation de MS VC++ 2005 (en ligne : http://msdn.microsoft.com/en-us/libr...8VS.80%29.aspx), la macro <span style="font-weight: bold">_CPPLIB_VER</span> apparaissait dans la liste des macros pré-définies. Ce qui m'a amené à penser que le compilateur exposait les dépendances du projet lors de la passe de compilation du code C. Visiblement ce n'est pas le cas, cette macro correspond grosso-modo à une macro directement définie dans un fichier d'en-tête (la macro est définie uniquement après l'inclusion du fichier d'en-tête, pas auparavant). Elle n'est donc pas visible dans les autres unités de compilation et ne peut pas être utilisée pour automatiser la génération des dépendances à la librairie C++.
    Au passage la &quot;macro prédéfinie&quot; <span style="font-weight: bold">_CPPLIB_VER</span> n'est plus listée dans la documentation de MS VC++ 2010 (en ligne : http://msdn.microsoft.com/en-us/libr...VS.100%29.aspx).

    La macro <span style="font-weight: bold">_VC_NODEFAULTLIB</span> n'est pas directement liée à l'option <span style="font-weight: bold">/NODEFAULTLIB</span>. L'utilisation qui en était faite auparavant est fausse.

    J'ignorais que le pragma message() pouvait concaténer des chaînes. Cela rend les choses bien plus simples (voir ci-dessous).

    Derniers points à relever, la DLL pour les ATL n'est pas listée et le code géré n'est pas supporté (voir : http://msdn.microsoft.com/en-us/libr...VS.100%29.aspx).

    Au début du fichier <span style="font-weight: bold">General.cpp</span>
    <div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>
    /* Uncomment if needed */
    /* #define MMFEXT_USE_CPPLIB */
    #include &quot;dependencies.h&quot;
    </pre></div></div>

    Routine <span style="font-weight: bold">GetDependencies()</span> fichier <span style="font-weight: bold">General.cpp</span>
    <div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>
    LPCSTR szDep[] = {

    #ifdef MMFEXT_STDLIB_DLL
    #pragma message(&quot;NOTICE: &quot; MMFEXT_STDLIB_DLL &quot; needed!&quot
    MMFEXT_STDLIB_DLL,
    #endif /* MMFEXT_STDLIB_DLL */

    #ifdef MMFEXT_USE_CPPLIB
    #ifdef MMFEXT_CPPLIB_DLL
    #pragma message(&quot;NOTICE: &quot; MMFEXT_CPPLIB_DLL &quot; needed!&quot
    MMFEXT_CPPLIB_DLL,
    #endif /* MMFEXT_CPPLIB_DLL */
    #endif /* MMFEXT_USE_CPPLIB */

    #ifdef MMFEXT_AFLL
    #pragma message(&quot;NOTICE: &quot; MMFEXT_AFLL &quot; needed!&quot
    MMFEXT_AFLL,
    #endif /* MMFEXT_AFLL */

    NULL /* Last item! */
    };

    LPCSTR* WINAPI DLLExport GetDependencies()
    {
    return szDep;
    }
    </pre></div></div>

    Fichier d'en-tête <span style="font-weight: bold">dependencies.h</span>
    <div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>
    /*
    * @version 1.0.0, 2010-02-27
    */

    #ifndef __MMFEXT_DEPENDENCIES__
    #define __MMFEXT_DEPENDENCIES__

    /*------------------------ Std lib and Cpp lib ------------------------*/
    #ifdef _DLL

    #if _MSC_VER == 1600 /* MS VS 2010 */
    #define MMFEXT_STDLIB_DLL &quot;msvcr100.dll&quot;
    #define MMFEXT_CPPLIB_DLL &quot;msvcp100.dll&quot;
    #elif _MSC_VER == 1500 /* MS VS 2008 */
    #define MMFEXT_STDLIB_DLL &quot;msvcr90.dll&quot;
    #define MMFEXT_CPPLIB_DLL &quot;msvcp90.dll&quot;
    #elif _MSC_VER == 1400 /* MS VS 2005 */
    #define MMFEXT_STDLIB_DLL &quot;msvcr80.dll&quot;
    #define MMFEXT_CPPLIB_DLL &quot;msvcp80.dll&quot;,
    #elif _MSC_VER == 1310 /* MS VS 2003 */
    #define MMFEXT_STDLIB_DLL &quot;msvcr71.dll&quot;
    #define MMFEXT_CPPLIB_DLL &quot;msvcp71.dll&quot;
    #elif _MSC_VER == 1300 /* MS VS 2002 */
    #define MMFEXT_STDLIB_DLL &quot;msvcr70.dll&quot;
    #define MMFEXT_CPPLIB_DLL &quot;msvcp70.dll&quot;
    #elif _MSC_VER == 1200 /* MS VS 6 */
    /* msvcrt.dll included with Windows */
    #define MMFEXT_CPPLIB_DLL &quot;msvcp60.dll&quot;
    #else
    #error Cannot resolve dependencies
    #endif

    #endif /* _DLL */

    /*-------------------------------- MFC --------------------------------*/
    #ifdef _AFLL

    /* @see afxver_.h */
    #if defined(_AFLL) &amp;&amp; !defined(_DLL)
    #error Please use the /MD switch for _AFLL builds
    #endif

    #if _MSC_VER == 1600 /* MS VS 2010 */
    #ifndef _UNICODE
    #define MMFEXT_AFLL &quot;mfc100.dll&quot;
    #else
    #define MMFEXT_AFLL &quot;mfc100u.dll&quot;
    #endif /* _UNICODE */
    #elif _MSC_VER == 1500 /* MS VS 2008 */
    #ifndef _UNICODE
    #define MMFEXT_AFLL &quot;mfc90.dll&quot;
    #else
    #define MMFEXT_AFLL &quot;mfc90u.dll&quot;
    #endif /* _UNICODE */
    #elif _MSC_VER == 1400 /* MS VS 2005 */
    #ifndef _UNICODE
    #define MMFEXT_AFLL &quot;mfc80.dll&quot;
    #else
    #define MMFEXT_AFLL &quot;mfc80u.dll&quot;
    #endif /* _UNICODE */
    #elif _MSC_VER == 1310 /* MS VS 2003 */
    #ifndef _UNICODE
    #define MMFEXT_AFLL &quot;mfc71.dll&quot;
    #else
    #define MMFEXT_AFLL &quot;mfc71u.dll&quot;
    #endif /* _UNICODE */
    #elif _MSC_VER == 1300 /* MS VS 2002 */
    #ifndef _UNICODE
    #define MMFEXT_AFLL &quot;mfc70.dll&quot;
    #else
    #define MMFEXT_AFLL &quot;mfc70u.dll&quot;
    #endif /* _UNICODE */
    #elif _MSC_VER == 1200 /* MS VS 6 */
    /* mfc42.dll included with Windows */
    #else
    #error Cannot resolve MFC dependency
    #endif

    #endif /* _AFLL */

    #endif __MMFEXT_DEPENDENCIES__

    </pre></div></div>

Similar Threads

  1. Quels extensions sont compatibles pour export Android avec MMF 2.5 standard ?
    By neurone77 in forum Android Export Module Version 2.0
    Replies: 4
    Last Post: 3rd January 2014, 12:26 PM
  2. IOS déploiement over the air (OTA)
    By graboide in forum Articles
    Replies: 0
    Last Post: 8th December 2012, 09:34 AM
  3. Bug avec MMF 253
    By ladite in forum Multimedia Fusion 2 - Technical Support
    Replies: 3
    Last Post: 28th November 2011, 05:06 PM
  4. Ouvrir Avec ...
    By ADS_3000 in forum Multimedia Fusion 2 - Technical Support
    Replies: 11
    Last Post: 21st April 2010, 11:49 PM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •