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

Visual C++ Discussion :

Instruction #import dynamique


Sujet :

Visual C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut Instruction #import dynamique
    Bonjour à tous,

    Je contrôle l'application google par l'intermédiaire de l'API COM. L'exemple basique est ici.

    Le problème est que si je démarre ce programme sur un pc qui a installé Google Earth à un autre emplacement que celui que j'indique au niveau de l'instruction #import, l'application ne démarrera pas.

    J'aimerai donc pouvoir faire choisir à l'utilisateur le chemin vers l'exécutable de Google Earth.

    Est-ce possible dans mon cas ?

    Merci d'avance

  2. #2
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    L'application ne crée-t-elle pas une clé de registre contenant cette valeur ?
    Auquel cas tu n'aurais qu'à récupérer la valeur sans rien demander à l'utilisateur.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    Je ne sais pas, comment puis-je vérifier ça ?

    Si je change la valeur dans le registre pendant le lancement du programme, est-ce qu'il m'est possible de relancer dynamiquement la fonction CoCreateInstance() permettant de démarrer Google Earth ?

  4. #4
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    On s'est mal compris : la clé de registre a du être crée par l'installation de Google Earth, si elle existe. Donc tu n'as rien a changer, juste à aller lire la valeur de la clé et l'utiliser là où tu en as besoin.

    Après pour récupérer la valeur d'une clé de registre, il n'y a pas de réel difficulté et tu trouveras plein d'exemples sur le forum.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    J'ai trouvé dans le registre la clé qui correspondant à ce que je recherche. après quelque recherche j'ai pu faire ça pour lire la valeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    HKEY hKey;
     
    RegOpenKeyEx(HKEY_CURRENT_USER,TEXT("Software\\Google\\Google Earth Plus\\InstallLocation"),0,KEY_READ,&hKey);
    Le problème est d'intégrer cette valeur directement dans l'import. Parce-que si je ne me trompe pas #import est une instruction préprocesseur non ?

  6. #6
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Citation Envoyé par black is beautiful Voir le message
    Parce-que si je ne me trompe pas #import est une instruction préprocesseur non ?
    oui c'est bien ça : http://msdn.microsoft.com/en-us/libr...8VS.80%29.aspx

    Par contre pourrais tu en dire un peu plus concernant ce que tu comptes faire ? Et donner un peu plus de code, comme l'import "normal" qui avait l'air de marcher. Parce que plus j'y pense et plus je me dit que ton problème n'est pas forcément là.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    Mon application interagit avec Google earth mais ce dernier n'est pas indispensable, je voudrais donc qu'un utilisateur ne possédant pas Google earth puisse quand même utiliser mon application. C'est pourquoi je veux vérifier dans un premier temps si l'application existe.

    Puis le second problème plus important, j'aimerai que l'application détecte automatiquement l'emplacement de l'exécutable de Google earth pour pouvoir interagir avec. Ce qui implique une détection dynamique à l'exécution mais je ne pense pas que ce soit possible avec l'instruction import. Je me trompe ?

    Je n'ai plus le code sous la main, je pourrai l'envoyer demain mais il reste similaire au code présent sur le lien que j'avais fournis dans le premier post.

    Merci pour l'aide

  8. #8
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    En effet, aller jeter un coup d'oeil à l'exemple m'a permis d'y voir un peu plus clair

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #import "C:\Program Files\Google\Google Earth\googleearth.exe" named_guids
    c'est la ligne qui nous intéresse et qui permet d'initialiser certaines variables (détail ici). A mon avis ces infos sont aussi disponibles dans le registre => y a plus qu'à

    Bon courage.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    J'ai lu tout ce qui concernait la directive import sur ton lien. Mais j'avoue que je ne vois pas du tout comment faire...

    Pourtant ton message me laissait croire que c'était évident, mais je ne suis pas très à l'aise avec tout ce qui concerne la base de registre...

  10. #10
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    J'ai lu tout ce qui concernait la directive import sur ton lien. Mais j'avoue que je ne vois pas du tout comment faire...
    cette directive te permet d'initialiser des variables GUID permettant d'identifier l'application que tu souhaites appeler en utilisant COM.

    Il va te falloir regarder du côté de l'utilisation précise de COM afin de comprendre comment une application y est enregistré.

    Après ça tu devrais être apte à trouver l'emplacement des clés dans le registre, à les récupérer et à initialiser les variables GUID toi-même (sans import)

    T'y es presque, courage

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    Ok, tout commence à s'eclaircir, je suis en train de lire tout ce qui concerne le Component Object Model (COM)

    Apparemment les GUIDs sont présents dans la base de registre à l'emplacement HKEY_CLASSES_ROOT\CLSID

    J'ai donc cherché l'objet utilisé dans le bout de code fournit, c'est-à-dire IApplicationGE.

    En cherchant ApplicationGE, j'ai trouvé la clé suivante :
    HKEY_CLASSES_ROOT\CLSID\{8097D7E9-DB9E-4AEF-9B28-61D82A1DF784}

    Son intitulé est le suivant : ApplicationGE Class

    Cette clé possède même l'emplacement de l'exécutable de Google Earth

    Donc ensuite je crois devoir utiliser la méthode CoCreateInstance avec ce GUID pour charger l'instance de la classe IApplicationGE.

    Est-ce que je pars du bon côté ?

  12. #12
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Ouais ça ma l'air pas mal du tout.
    T'as plus qu'à te débrouiller pour que ça marche maintenant

    Une idée pour vérifier que tu ne te plantes pas serait de vérifier les valeurs initialisées par import, pour pouvoir après les comparer aux tiennes.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    Ca avance, mais je bloque encore sur un point. Je n'utilise donc pas de import, voici le code que j'utilise pour charger l'interface de Google Earth :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    IApplicationGE* ge;
     
    CoInitialize(NULL);
        HRESULT hr;
     
    	_GUID clsId = {0x8097D7E9,0xDB9E,0x4AEF,0x9B,0x28,0x61,0xD8,0x2A,0x1D,0xF7,0x84};
    	_GUID iId = {0x2830837B,0xD4E8,0x48C6,0xB6,0xEE,0x04,0x63,0x33,0x72,0xAB,0xE4};
     
        hr = CoCreateInstance(  clsId,
                                NULL,
                                CLSCTX_LOCAL_SERVER,
                                iId,
                                (void**) &ge );
    Le problème est qu'il ne connait pas le type IApplicationGE, puisque je n'ai plus de import.

    Comment faire pour qu'il m'autorise à instancier l'interface ?

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    Je crois que j'ai trouvé, il y a un fichier IDL avec l'ensemble des définitions que je cherche. Comment importer un .IDL ?

    Car que ce soit avec la directive import ou include, aucune ne fonctionne

  15. #15
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Ces définitions ne seraient-elles pas aussi disponibles dans un .h ?

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    C'est bon ça fonctionne. En fait sur le site de google http://earth.google.com/comapi/.Ils fournissent le fichier .idl définissant tout ce qui est nécessaire.

    Il faut ensuite le compiler avec l'outil MIDL de Visual Studio.

    En tapant la commande suivante : midl earth.idl /tlb earth.tlb

    Le fichier earth.tlb est compilé, c'est celui-ci qu'il faut importer avec #import. Et tout fonctionne !

    Merci beaucoup pour ton aide, j'ai pu faire tout ce que je voulais, je n'y serai pas arrivé sans toi

  17. #17
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Heureux d'avoir pu être utile

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

Discussions similaires

  1. import dynamique de vidéo
    Par julien.63 dans le forum Flash
    Réponses: 4
    Dernier message: 02/03/2007, 14h52
  2. Réponses: 2
    Dernier message: 17/11/2006, 11h35
  3. Importation dynamique de librairie partagée
    Par yoann19 dans le forum Flash
    Réponses: 7
    Dernier message: 13/11/2006, 12h11
  4. Réponses: 1
    Dernier message: 20/09/2006, 19h51
  5. Réponses: 6
    Dernier message: 08/08/2006, 11h19

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