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++/CLI Discussion :

Erreur lors d'un appel � une DLL non-manag�e, � partir d'une appli VB.NET


Sujet :

C++/CLI

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par d�faut Erreur lors d'un appel � une DLL non-manag�e, � partir d'une appli VB.NET
    Bonjour � tous,

    Je d�veloppe sous Vista (avec VS2005) une application qui doit permettre de renseigner des m�tadonn�es pour des fichiers (en utilisant le syst�me de propri�t�s de Vista).

    J'ai donc une interface en VB.NET qui permet d'annoter des fichiers.
    Cette interface appel une DLL �crite en c++ non-manag� (qui s'occupe de lire/�crire les propri�t�s des fichiers).
    L'interface et la DLL non-manag�s sont �videmment deux projets distincts (je poss�de le code des deux projets).

    Apr�s avoir compil� la DLL en mode release je la copie dans le r�pertoire d�ex�cution de l�interface, puis je compile celle-ci (�galement en mode release). Lors de l'utilisation de l'interface, j'obtiens l'erreur suivante :
    "Unable to load DLL 'PropertyHelper.dll': The application has failed to start because its side-by-side configuration is incorrect."

    Je pr�cise que la DLL est g�n�r�e avec un manifeste int�gr�.

    Merci d�avance pour vos solutions/suggestions !

  2. #2
    R�dacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par d�faut
    c'est une dll native ? comment tu l'appelles ?
    as-tu essay� de faire un wrapper en C++/CLI ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par d�faut
    Bonjour,

    C�est effectivement une dll native.

    Pour l�appeler en VB.NET j�ai une classe avec des m�thodes de classe qui correspondent aux fonctions de la dll native :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    Public Class PropertyHelper
        Declare Auto Function nomdunefonction Lib "PropertyHelper.dll" () As …
    End Class
    Puis j�appel les m�thodes ainsi : "PropertyHelper.nomdunefonction()"

    J�ai �galement essay� avec un wrapper C++/CLI, mais j�obtiens la m�me erreur ("Unable to load DLL 'PropertyHelper.dll': The application has failed to start because its side-by-side configuration is incorrect.").

    Voici le code du wrapper :

    WrapperPropertyHelper.h
    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
     
    #pragma once
    #include "stdafx.h"
     
    using namespace System;
    using namespace System::Runtime::InteropServices;
    #pragma comment (lib, "PropertyHelper.lib")
     
    /* Ici je ne fais qu’importer la fonction "test" de la dll native, 
    qui renvoie simplement une chaine de caractères */
    [DllImport("PropertyHelper.dll")] extern "C" String^ test();
     
    public ref class WrapperPropertyHelper
    {
        public:
        static String^ Wrappertest();
    };
    WrapperPropertyHelper.cpp
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    #include "stdafx.h"
    #include "WrapperPropertyHelper.h"
     
    String^ WrapperPropertyHelper::Wrappertest(){
    	return test();
    }
    Le wrapper est g�n�r� correctement, la dll native aussi. J'ai cr�� une interface simpliste qui r�f�rence le wrapper, et qui essaye d'utiliser la fonction test(), mais l'erreur survient au niveau de l'appel dans la fonction WrapperPropertyHelper::Wrappertest().

  4. #4
    R�dacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par d�faut
    tu as les sources de la dll C ?
    Pourquoi ne pas avoir utilis� dllimport dans ton appli vb.net ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par d�faut
    Tout d'abord merci pour l'attention que vous portez � ce probl�me.

    Ce n�est pas une DLL C, mais C++.
    J�avais essay� (laborieusement) de passer cette DLL en C++/CLI, mais j�obtenais plein d�erreurs.

    Voici le code de la DLL :

    PropertyHelper.h
    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
     
    #pragma once
     
    #include <shobjidl.h>
    #include <propsys.h>
    #include <propvarutil.h>
    #include <propkey.h>
    #include <strsafe.h>
     
    extern "C" __declspec(dllexport) PWSTR EnumerateProperties(PCWSTR pszFilename);
    extern "C" __declspec(dllexport) PWSTR GetPropertyValue(PCWSTR pszFilename, PCWSTR pszCanonicalName);
    extern "C" __declspec(dllexport) HRESULT SetPropertyValue(PCWSTR pszFilename, PCWSTR pszCanonicalName, PCWSTR pszValue);
    extern "C" __declspec(dllexport) HRESULT GetPropertyDescription(PCWSTR pszCanonicalName);
    extern "C" __declspec(dllexport) HRESULT GetPropertyStore(PCWSTR pszFilename, IPropertyStore** ppPropertyStore, GETPROPERTYSTOREFLAGS gpsfFlags);
    extern "C" __declspec(dllexport) PCWSTR test();
    PropertyHelper.cpp
    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
     
    #include "StdAfx.h"
    #include "PropertyHelper.h"
     
    extern "C" __declspec(dllexport) PWSTR EnumerateProperties(PCWSTR pszFilename)
    {...}
    extern "C" __declspec(dllexport) PWSTR GetPropertyValue(PCWSTR pszFilename, PCWSTR pszCanonicalName)
    {...}
    extern "C" __declspec(dllexport) HRESULT SetPropertyValue(PCWSTR pszFilename, PCWSTR pszCanonicalName, PCWSTR pszValue)
    {...}
    extern "C" __declspec(dllexport) HRESULT GetPropertyDescription(PCWSTR pszCanonicalName)
    {...}
    extern "C" __declspec(dllexport) HRESULT GetPropertyStore(PCWSTR pszFilename, IPropertyStore** ppPropertyStore, GETPROPERTYSTOREFLAGS gpsfFlags)
    {...}
    extern "C" __declspec(dllexport) PCWSTR test()
    {
    	return L"abcdefghijklmnopqrstuvwxyz";
    }
    Je n'ai pas mis le code du corps des cinq premi�res fonctions car il est assez long, et de toute fa�on un simple appel � la fonction test provoque l'erreur.

    Concernant l'appel � la DLL dans l'interface cod�e en VB.NET, je me suis r�f�r� � cette rubrique sur MSDN : http://msdn2.microsoft.com/fr-fr/lib...y4(VS.80).aspx. D'apr�s celle-ci, il est possible d'utiliser Declare ou DllImportAttribute indiff�remment.

  6. #6
    R�dacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par d�faut
    ok, donc, ton projet C++, tu as essay� de le recompiler en utilisant l'option de compilation /clr, pour avoir une dll mixte ?
    ca a donn� quoi comme erreurs ?

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par d�faut
    Si je mets juste /clr et que je n'essaye pas de convertir les fonctions en code manag� (avec des gcnew, des "^", ...) ca ne donne pas d'erreurs de compilation mais quelques warning, tous du m�me type (C4793: 'vararg' : causes native code generation for function ...). Le projet est g�n�r� malgr� ces warnings.
    Si je r�f�rence la DLL mixte obtenue dans mon application VB.net, je n'ai acc�s � aucune de ses fonctions (�tant donn� que celles-ci sont non-manag�es).

    Je m'aper�ois en lisant ton tutorial de migration au c++ manag� (http://nico-pyright.developpez.com/t...grationcppnet/) que je pourrais peut-�tre m'en sortir en ajoutant des fonctions manag�es dans la DLL, qui agiraient comme un wrapper, chacune transmettant des arguments � une des fonctions non-manag�e et r�cup�rant une valeur de retour. Est-ce que ca serait faisable ?

  8. #8
    R�dacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par d�faut
    oui, je pense que ca sera le plus simple

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par d�faut
    Cool, je vais essayer ca.

    Dans ton tutorial, tu utilises StringToHGlobalUni pour convertir des String^ en PCWSTR, est ce que tu connaitrais une fonction permettant de faire la conversion inverse (PCWSTR -> String^) ?

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par d�faut
    J'ai donc essay� de rajouter une fonction manag� dans la DLL native, en compilant en /clr.

    J'ai rajout� ceci dans PropertyHelper.h :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    public ref class WrapperPropertyHelper
    {
    public:
    	static System::String^ WrapperLocalTest();
    };
    ... et ceci dans PropertyHelper.cpp :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    System::String^ WrapperPropertyHelper::WrapperLocalTest(){
    	return gcnew System::String(test());
    }
    La conversion PCWSTR -> String^ se fait en utilisant un constructeur de la classe System::String.

    J'ai r�g�n�r� la DLL mixte ainsi obtenue, puis je l'ai r�f�renc� dans l'application VB.net, et j'ai essay� d'appeler la fonction WrapperLocalTest(), mais j'obtiens une fois de plus l'erreur "The application has failed to start because its side-by-side configuration is incorrect.".

    Voici le message d'erreur complet : "Could not load file or assembly 'PropertyHelper, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The application has failed to start because its side-by-side configuration is incorrect.".

    J'avoue que je ne saisis pas ce que veux dire le message. "The application" c'est la DLL mixte ?

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par d�faut
    C'est bon, en fait ca marche

    J'ai r�ussi � utiliser la DLL mixte : je suis reparti du projet initial (le projet donn� comme exemple dans le SDK Vista, PropertySystem), j'ai fais quelques modifications, puis j'ai rajout� des fonctions "wrappantes" au sein meme de cette DLL et j'ai g�n�r� avec l'option /clr.

    Je ne sais pas si ca a du sens de proc�der ainsi, mais en tout cas ca fonctionne. La possibilit� de mixer du C++ natif avec du C++/CLI c'est bien sympa .

    Merci beaucoup !
    ++

  12. #12
    R�dacteur/Mod�rateur


    Homme Profil pro
    D�veloppeur .NET
    Inscrit en
    F�vrier 2004
    Messages
    19 875
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur .NET
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 19 875
    Par d�faut
    Je sais, le probl�me est r�solu, mais je continue le d�bat
    Je suppose que tu utilises des fonctions de l'API Windows Vista pour acc�der aux propri�t�s ? Dans ce cas, il me semble que le plus simple est sans doute de mapper ces fonctions natives directement dans ton code manag� avec l'attribut DllImport....

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par d�faut
    Oui, c'est ce que j'avais fais au d�part, mais j'avais du faire une mauvaise manip dans les options du projet de la dll et je me suis retrouv� avec l'erreur qui m'a amen� ici (The application has failed to start because its side-by-side configuration is incorrect).

    La version avec des fonctions manag�es dans la dll rendue mixte me convient parfaitement, j'essayerais peut-�tre de revenir � la solution consistant � mapper les fonctions natives dans le code VB, mais pour l'instant je garde la dll mixte et je me consacrer � autre chose.

    Derni�re question : ce me para�t bizarre que les fonctions permettant de g�rer les propri�t�s (les m�tadonn�es) des fichiers sous Vista soient des fonctions "non-manag�es", qui ne fassent pas partie du Framework... Je suis peut-�tre pass� � cot� de certaines classes du Framework (donc manag�es et utilisable quelque soit le langage VB, C#, C++/CLI) qui permettent de faire ce travail ?

    ++

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 5
    Dernier message: 14/01/2008, 16h39
  2. appeler du .NET depuis une dll non manag�
    Par sebs_78 dans le forum VC++ .NET
    R�ponses: 1
    Dernier message: 05/12/2007, 09h36
  3. R�ponses: 3
    Dernier message: 19/02/2007, 15h07
  4. Dll manag� utilise une dll non manag�
    Par DAMVAL dans le forum C++/CLI
    R�ponses: 3
    Dernier message: 28/11/2006, 10h36
  5. R�ponses: 12
    Dernier message: 30/01/2006, 21h13

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