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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 ?

+ 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