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

VB.NET Discussion :

Chargement d'une Dll C++ sur VB 2008


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Points : 28
    Points
    28
    Par défaut Chargement d'une Dll C++ sur VB 2008
    Bonjour à vous tous,


    Je dispose d'une dll qui charge et affiche une image grâce à la bibliothèque OpenCV2.4. Cependant, ma vraie dll fait beaucoup plus de choses, je vous rassure: j'ai juste voulu commencer avec quelque chose de simple.
    Cette dll a été faite en C++ sous Visual Studio 2008.
    Elle a été testée avec un petit projet sous Visual Studio: cela fonctionne très bien.
    J'ai utilisé Dependency Walker pour analyser ma dll: je n'ai pas d'erreur et je peux ainsi récupérer l'Alias de ma fonction.

    Maintenant, je cherche à charger cette dll sous VB 2008.
    J'ai placé ma dll et celles utilisées par ma dll ( Cf .cpp ) dans le répertoire du projet VB et c'est tout ( il se peut que j'ai déjà faux ).

    Voici .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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #pragma once
    #pragma comment ( lib, "opencv_core240.lib" )
    #pragma comment ( lib, "opencv_highgui240.lib" )
    #pragma comment ( lib, "opencv_imgproc240.lib" )
     
     
    #include <iostream>
    #include <stdio.h>
     
    #include "opencv/cv.h"
    #include "opencv/highgui.h"
     
     
    __declspec(dllexport) int __stdcall loadImage( int value )
    {
    	cv::Mat img;
     
    	img = cv::imread( "Image.tif" );
     
    	if( !img.data )
    	{
    		std::cout<<"Error: could not open the image!"<<std::endl;
    	}
    	else
    	{
    		cv::namedWindow( "Image", CV_GUI_NORMAL );
    		cv::imshow( "Image", img );
    		std::cout<<"End"<<std::endl;
    	}
    	cv::waitKey();
    	return value;	
    }
    Je n'agis pas sur value, mais je cherche juste à voir si je peux faire passer une valeur dans ma fonction.

    Voilà mon .def

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LIBRARY   loadImage
    EXPORTS
      loadImage = ?loadImage@@YGHH@Z
    J'ai lu plusieurs pages pour résoudre mon problème et j'ai donc appris qu'il fallait ajouter un fichier .def.

    Mon coe sous VB 2008 ( je ne connais rien en VB 2008: on m'a juste passé un bout de code. Mon objectif est uniquement de faire tourner le prog VB )
    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
    19
    20
    21
    22
    23
    Option Strict Off
    Option Explicit On
    Friend Class FrmMain
        Inherits System.Windows.Forms.Form
     
        Declare Function loadImage Lib "loadImage.dll" Alias "loadImage" (ByVal value As Integer) As Integer
     
    	Private Sub CmdGO_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles CmdGO.Click
    		On Error GoTo CmdGO_Click_err
     
            LblResult.Text = loadImage(5)
    		LblResult.ForeColor = System.Drawing.Color.Lime
     
    		Exit Sub
    CmdGO_Click_err: 
    		LblResult.Text = Err.Description
    		LblResult.ForeColor = System.Drawing.Color.Red
    	End Sub
     
        Private Sub LblResult_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LblResult.Click
     
        End Sub
    End Class

    Cependant, une erreur apparaît
    "Impossible de trouver le point d'entrée "loadImage" dans la DLL "loadImage.dll""


    Pouvez-vous m'aider à résoudre ce problème?

    N'hésitez pas à me demander des précisions!
    Merci d'avance

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    Une petite avancée:

    Je croyais que le point .def permet de redéfinir l'Alias qu'on utilise dans le prototype de "Declare", mais apparemment il ne fait pas cela.
    J'ai donc tapé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare Function loadImage Lib "loadImage.dll" Alias "?loadImage@@YGHH@Z " (ByVal value As Integer) As Integer
    De plus, je dois placer la dll dans le dossier system32 -_-', mais cela sera un problème pour celui qui m'a donné ce code.


    Désormais, j'utilise ma vraie dll ( avec pleins de traitements ) et à l'éxécution, j'obtiens:
    "R6025
    - pure virtual function call"
    Avez-vous des pistes?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    Le problème est causée par la bibliothèque XML, TinyXml, que j'utilise. C'est l'appel au destructeur par défaut qui génére cette erreur: je suis donc dans la mauvaise section.

    J'ai enlevé tous les destructeurs par défaut et tout fonctionne.


    [ @ux modérateurs du forum: dsl pour ce post inutile! ]

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/08/2009, 19h54
  2. Chargement d'une DLL
    Par olive_le_malin dans le forum MFC
    Réponses: 15
    Dernier message: 16/12/2005, 17h09
  3. Réponses: 4
    Dernier message: 03/11/2005, 13h57
  4. Contexte de chargement d'une DLL
    Par Guillemot dans le forum Windows
    Réponses: 2
    Dernier message: 10/07/2005, 09h34
  5. Chargement d'une DLL et utilisation du multithread
    Par Maitre Kanter dans le forum Langage
    Réponses: 6
    Dernier message: 07/09/2004, 23h18

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