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# Discussion :

Appeler une fonction "non managée" (DLL) qui appelle LoadLibrary


Sujet :

C#

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Appeler une fonction "non managée" (DLL) qui appelle LoadLibrary
    Bonjour à tous,

    J'essaie d'utiliser une DLL externe(DLL1) développée en C pour mon application C#/WPF.

    J'ai commencé à écrire une nouvelle DLL(DLL2), également en C, pour encapsuler les fonctions de la DLL1 pour que les types soient compatibles (PInvoke).

    Or ma DLL1 appelle des fonctions système type "LoadLibrary" et "GetProcAddress".

    A l'exécution, mon programme plante lors de l'appel à LoadLibrary dans la DLL1. Ci-dessous, mon code si ça vous tente..
    J'ai tenté pas mal de combinaisons __stdcall ou bien __cdecl, ça n'a rien donné.

    Merci de vos idées, je bosse sous VS2010C++ & VS2010C#.

    Olivier


    ##DLL1.h (oui y'a du code dans le .h, je ne gère pas ça..)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    tStatus LoadDLL(void)
    {
    	if ((hInst=LoadLibrary(_LOCAL_DLL_STR)) == NULL)
    	{
    		if ((hInst=LoadLibrary(REFMUX_STR(_GLOBAL_DLL_STR))) == NULL)
    		{
    			return(STATUS_ERR_FILEDLL);
    		}
    	}
    	return STATUS_OK;
    }
    ##DLL2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include "DLL1.h"
    extern "C"
    {
    	__declspec (dllexport) tStatus __stdcall Bdg_LoadDll(void)
    	{		
    		tStatus udtRsult;
     
    		udtRsult = LoadDLL();
     
    		return udtRsult;
    	}
    }
    ## C Sharp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class DllImport
    {
    	[DllImport(DLL2_PathName, CallingConvention = CallingConvention.StdCall)]
    	public static extern char Bdg_LoadDll();
     
    	public DllImport()
    	{
    		Bdg_LoadDll(); // Ca plante!
    	}
    }

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Si j'ai bien compris, c'est la DLL2 qui importe la DLL1
    dans ce cas le code de la DLL2 est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "DLL1.h"
    extern "C"
    {
    	__declspec(dllimport) tStatus __stdcall Bdg_LoadDll(void)
    	{		
    		tStatus udtRsult;
     
    		udtRsult = LoadDLL();
     
    		return udtRsult;
    	}
    }
    un petit copier/coller trop rapide

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonsoir,

    Merci d'avoir jeter un coup d'oeil .
    Je ne comprends pas ta réponse, j'ai dû mal m'exprimer!

    Je souhaite exporter la fonction Bdg_LoadDll vers mon appli C#, c'est pourquoi je pense qu'il faut bien laisser dllexport dans la déclaration? C'est LoadDLL() qui fait partie du fichier de définition de la DLL1..

    Ma DLL2 inclut ce fichier de définition de la DLL1 qui contient ce bout de code qui charge en mémoire la DLL1 via l'appel à LoadLibrary.

    J'espère que je suis clair

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Finalement, j'ai développé ma DLL2 en tant que C++ CLR, j'ai chargé la DLL1 dans un thread différent de celui du GUI et mon plantage a disparu.

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

Discussions similaires

  1. requête qui appelle une fonction
    Par da_latifa dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 10/02/2010, 21h47
  2. Réponses: 7
    Dernier message: 26/08/2009, 13h44
  3. Lien <a href .. qui appelle une fonction php
    Par CristinaB dans le forum Langage
    Réponses: 1
    Dernier message: 30/05/2008, 16h03
  4. Récupérer le nom du fichier qui appelle une fonction
    Par DeezerD dans le forum Langage
    Réponses: 2
    Dernier message: 24/03/2007, 14h37
  5. Connaitre le processus qui appelle une fonction API
    Par RazielReaver dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 28/05/2006, 13h56

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