Probleme link c++

seb8334 Messages postés 5 Statut Membre -  
 Utilisateur anonyme -
Bonjour

J'ai un probleme de link dans mon programme c++ suivant :

--------------------------------------------------------------------
#include "stdafx.h"

#include "Global.asax.h"

#include <windows.h>

#include "testDLLClass.h"

//using namespace std;

namespace testDLL
{
int testDLLClass::Multiply(int i,int j){

//HMODULE hDLL = LoadLibrary("maDLL.dll");
/*
//on declare un pointeur sur la fonction (avec des 2 parametre ici pour multiply)
typedef int (WINAPI * DLL_Function_Multiply)(int _Value,int _Value2);
DLL_Function_Multiply pfn_Multiply;

//on appelle GetProcAddress(hdll,NOM_DE_LA_FONCTION_DANS_FICHIER_.REF);
pfn_Multiply = (DLL_Function_Multiply)GetProcAddress(hDLL,"Multiply");

//on appelle la fonction
int res = pfn_Multiply(i,j);

//on libère la DLL
FreeLibrary(hDLL);

//return res;
*/

return i*j;
}

};
-----------------------------------------

cela me dit :
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\ServProv.h(93): error C2872: 'IServiceProvider' : ambiguous symbol

si je commente la declaration #include <windows.h>
cela marche mais j'en ai besoin pourl faire l'appel a la dll

merci d'avance car je galere vraiment

3 réponses

  1. Utilisateur anonyme
     
    Bonjour,

    pour la ligne :
    #include <windows.h>

    dans mon bouquin, la déclaration sous <windows.h>
    doit se faire "windows.h", l'utilisation des " <> " ne se
    fait qu'avec les nouvelles librairies [ C++ ] qui n'ont
    pas d'extension [ .h ].

    ex.:

    #include <iostream>

    #include "window.h"

    Lupin
    0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Non je ne suis pas tout à fait d'accord :

    - les headers de la libc standard s'incluent avec < > et sans .hpp ou .h au bout :
    #include <string>
    #include <iostream>
    

    - les headers contenus dans les répertoire d'include (LD_LIBRARY_PATH sous linux) s'incluent avec < > mais avec l'extenstion :
    #include <malibrairie/plop.hpp>
    

    - les autres headers s'incluent avec des " " :
    #include "tapir.hpp"

    - si c'est un haeder C, pour que ça marche avec tout les compilateurs :
    extern "C"{
      #include <string.h>
    }
    

    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\ServProv.h(93): error C2872: 'IServiceProvider' : ambiguous symbol

    Tu fais rférence à une erreur mais tu ne nous a pas donné le code correspondant (ligne 93 de c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\ServProv.h). A priori tu as défini deux fois le symbole 'IServiceProvider'.

    C'est assez surprenant mais c'est peut être simplement que les deux namespaces pour ces deux symboles sont différents et que par le biais des using namespace, ton compilateur est perdu. Exemple
    namespace plop1{
      class IServiceProvider{
        ...
      };
    };
    namespace plop2{
      class IServiceProvider{
        ...
      };
    };

    Auquel cas tu t'en sors en supprimant :
    using namespace plop1;
    using namespace plop2;

    et en manipulant :
    plop1::IServiceProvider
    plop2::IServiceProvider

    Bonne chance
    0
  3. Utilisateur anonyme
     
    Bonjour mamiemando,

    en fait je comprends un peu ta rèticence !

    mais je crois aussi que ce sont des traces du C !

    voici le texte de Deitel&Deitel :

    17.2 Directive de précompilation #include
    La directive de précompilation #include, que vous trouverez
    partout dans ce texte, provoque l'insertion d'une copie d'un
    fichier spécifié à la place de la directive. Les deux formes
    d'include sont 
    
                 #include <nomfichier>
                 #include "nomfichier"
    
    La différence entre elles réside dans l'emplacement ou le
    précompilateur recherche le fichier à inclure. Si le nom de
    fichier est entouré de crochets ( < et > ), ce qui prévaut pour
    les fichiers d'en-tête de la bibliothèque standard, le 
    précompilateur recherche le fichier indiqué d'une façon qui
    dépend de l'implantation, normalement dans des répertoires
    prédéfinis. Si le nom de fichier est entouré de guillemets, le
    précompilateur débute la recherche dans le même que le fichier
    compilé, puis la poursuit de la même façon que pour les
    fichiers entourés entourés de crochets. Cette méthode est
    normalement utilisée pour inclure des fichiers d'en-tête
    définis par le programmeur.
    


    bon, c'est de la théorie, sachant que presque tous utilisent
    les fonctionnalité du C en C++. Mais c'était le sens de mon
    intervention.

    Pour obtenir une bonne pratique de programmation par
    défaut je pose le postulat suivant :

    Les crochets ( < et > ) = Librairie std C++ [ !=(*.h) ]
    Les guillemets = Fichier du programmeur [ !=(<>) ]

    je repère ainsi facilement les librairies C, mais je ne suis pas sous Linux !

    @+
    Lupin
    0