Probleme link c++

Fermé
seb8334 Messages postés 4 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 10 avril 2006 - 4 avril 2006 à 11:35
 Utilisateur anonyme - 6 avril 2006 à 01:22
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
A voir également:

3 réponses

Utilisateur anonyme
4 avril 2006 à 15:10
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
mamiemando Messages postés 33648 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 29 avril 2025 7 846
5 avril 2006 à 09:24
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
Utilisateur anonyme
6 avril 2006 à 01:22
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

Discussions similaires