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

C++Builder Discussion :

Je n'arrive pas à passer une référence


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut Je n'arrive pas à passer une référence
    Bonsoir,

    J'essaie d'utiliser la JCL pour utiliser une classe c# en .net.
    J'ai trouvé du code delphi qui permet de le faire mais le problème c'est que je n'arrive pas à traduire une ligne.
    Je bloque sur le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    System::DelphiInterface<IObjectHandle> obj;
    //IObjectHandle *obj;
    int result = (IObjectHandle *)IUnknown(AppDomain->DefaultInterface->CreateInstanceFrom(
    ExtractFilePath(Application->ExeName)+"lib.dll", "maclassecsharp", &obj));
    A l'origine, le code devait être le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //Create an instance of the dot Net class
    obj := IUnknown(AppDomain.CreateInstanceFrom(
    ADotNetAssemblyUnc, ADotNetClassName)) as IOBjectHandle;
    Et l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [BCC32 Erreur] Unit1.cpp(166): E2357 Référence initialisée avec 'IObjectHandle * *', nécessite lvalue de type '_di__ObjectHandle'
    [BCC32 Erreur] Unit1.cpp(166): E2342 Mauvaise correspondance de type dans le paramètre '__CreateInstanceFrom_result' ('_di__ObjectHandle &' désiré, 'IObjectHandle * *' obtenu)
    Si je ne met pas '&' devant obj, j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [BCC32 Erreur] Unit1.cpp(166): E2342 Mauvaise correspondance de type dans le paramètre '__CreateInstanceFrom_result' ('_di__ObjectHandle &' désiré, '_di_IObjectHandle' obtenu)
    Quelqu'un peut m'aider ?

    Merci

  2. #2
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    J'ai jamais utilisé ce genre de code, par contre je trouve ça bizarre de caster en IObjectHandle * et d'en suite mettre la valeur dans un int.

    En plus, est-ce que tu es certain que CreateInstanceFrom a comme premier paramètre une String ou AnsiString (ceux de C++Builder)?

    Au moins, j'ai tenter une réponse, c'est mieux que rien. Enfin, je l'espère
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  3. #3
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    System::DelphiInterface<IObjectHandle> obj;
    //IObjectHandle *obj;
    int result = (IObjectHandle *)IUnknown(AppDomain->DefaultInterface->CreateInstanceFrom(
    ExtractFilePath(Application->ExeName)+"lib.dll", "maclassecsharp", &obj));
    Je pense que tu devrais faire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (IObjectHandle **) result = (IObjectHandle **)IUnknown(AppDomain->DefaultInterface->CreateInstanceFrom(
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  4. #4
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Merci pour ces réponses. Au moins, ça me permet d'avancer.

    Le code dont je me suis inspiré utilise une ancienne version de cette librairie. Voici la déclaration de la fonction qui pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HRESULT __safecall CreateInstanceFrom(const System::WideString assemblyFile, const System::WideString typeName, _di__ObjectHandle &__CreateInstanceFrom_result)
    pour le (IObjectHandle *), c'est une erreur de ma part, c'est un HRESULT. Pour tester, je peux l'enlever.
    Par contre, le compilateur a l'air d'accepter l'UnicodeString.

    Avec ces informations supplémentaires, vous avez d'autres idées ?
    Moi, je ne vois toujours pas la solution.

    Merci

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    J'ai pu avancer un petit peu. Le code à traduire est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //Create an instance of the dot Net class
    obj := IUnknown(AppDomain.CreateInstanceFrom(
    ADotNetAssemblyUnc, ADotNetClassName)) as IOBjectHandle;
    Et pour l'instant j'obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    _di__ObjectHandle obj;
    HRESULT instresult = AppDomain->DefaultInterface->CreateInstanceFrom(
    ExtractFilePath(Application->ExeName)+"lib.dll", "maclassecsharp", obj);
    int result = IUnknown(instresult);
    Et du coup, j'ai une erreur à la dernière ligne :
    [BCC32 Erreur] Unit1.cpp(168): E2352 Impossible de créer une instance de la classe abstraite 'IUnknown'
    Et la, je ne sais pas quoi faire.

    Une idée ?

    Merci

  6. #6
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    J'ai trouvé ce code sur un forum:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LPVOID *ppv;
    *ppv = (IUnknown*) this;
    Tu peux essayer en mettant this = instresult.

    J'ai aucune idée si ça va fonctionner
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  7. #7
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Non, ça ne fonctionne pas.

    Je vais directement poser la question sur le forum dotnet. Il y aura bien quelques personnes qui savent faire fonctionner l'interop.

    Merci

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

Discussions similaires

  1. [phpMyAdmin] Pourquoi je n'arrive pas à passer une table en innoDB, "table is full"?
    Par guillaume7684 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 14/02/2011, 10h29
  2. Je n'arrive pas à recuperer une image
    Par lemonsoda dans le forum Langage
    Réponses: 6
    Dernier message: 26/01/2006, 09h32
  3. Réponses: 7
    Dernier message: 25/01/2006, 21h37
  4. [HTML][CSS] W3C--> Je n'arrive pas à résoudre une erreur
    Par gwendy dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 23/12/2005, 23h50
  5. Je n'arrive pas à détruire une fenêtre
    Par CORREGE Frédéric dans le forum MFC
    Réponses: 6
    Dernier message: 22/02/2004, 20h28

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