Probleme link c++

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. 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
    1. Modérateur
      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
      1. 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