OVH Cloud OVH Cloud

pb de "type"

20 réponses
Avatar
Alni
Bonjour,

J'ai un petit soucis avec les types.
(Je suis sous VC++ 5.0)

//J'importe une dll de manipulation des objet COM d'un serveur ISA

#import "C:\Program Files\Microsoft ISA Server\msfpccom.dll"

//Je déclare mes objets :

DWORD dwRet = 0;
HRESULT hr = CoInitializeEx (NULL, COINIT_APARTMENTTHREADED );
if (SUCCEEDED (hr) )
{
FPCLib::IFPCPtr fpcRoot;
FPCLib::IFPCArraysPtr fpcArrays;
FPCLib::IFPCArrayPtr fpcArray;
FPCLib::IFPCServersPtr fpcServers;
FPCLib::IFPCWebSessionPtr fpcWebSession;
FPCLib::IFPCWebSessionsPtr fpcWebSessions;
FPCLib::IFPCServerPtr fpcServer;
FPCLib::IFPCFirewallSessionsPtr fpcFirewallSessions;
FPCLib::IFPCFirewallSessionPtr fpcFirewallSession;
FPCLib::IFPCDestinationSetsPtr fpcDestinationSets;
FPCLib::IFPCDestinationSetPtr fpcDestinationSet;
FPCLib::IFPCDestinationPtr fpcDestination;

// J'obtiens le pointeur sur l'objet ISA

hr = fpcRoot.CreateInstance("FPC.Root");

// Ensuite, je parviens à parcourir la config de mon serveur en utilisant
les
membres de cet objet fpcRoot.

// Sauf ici ou je ne parviens pas à me débrouiller a faire un switch/case à
partir du résultat fourni par une fonction membre d'un des objets.

for (long l=1;l<=fpcDestinationSet->Count;l++)
{
fpcDestination=fpcDestinationSet->Item(_variant_t(l),(BSTR) NULL
,(BSTR) NULL );

switch ( fpcDestination->Type ) //*ICI* ça coince
// On peut aussi utiliser ->GetType() même punition
{
case 0 :
printf ("\t\tDomaine : %-20s \n", (char*)
fpcDestination->DomainName);
break;
case 1 :
printf ("\t\tAdresse IP : %-20s \n", (char*)
fpcDestination->IP_From);
break;
default :
printf ("\t\tDomaine + URL on verra après....");

}
}
----------------------------
J'ai une erreur :
error C2450: switch expression of type 'struct FPCLib::IFPCDestination *' is
illegal Integral expression required

nb : Mon objet destination est bien valide, car si je ne mets que des
destinations de type "domain" dans mon destinationSet, alors je peux les
afficher avec :
printf ("\t\tDomaine : %-20s \n", (char*)
fpcDestination->DomainName);
Sans switch/case pour gerer le type.

Le membre Type d'un objet Destination est défini ici dans le msdn
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/isa/isaobj2_92ex.asp
Et de ce que j'en ai compris, il renvoie une valeur comprise entre 0 et 2
selon le type de l'objet destination.

enum FpcDestinationAddressType {
fpcDestinationTypeDomain,
fpcDestinationTypeSingleIp,
fpcDestinationTypeIpRange
};

Dans le fichier .tli obtenu par l'import de la dll je trouve :

#pragma implementation_key(447)
inline enum FpcDestinationAddressType FPCLib::IFPCDestination::GetType ( ) {
enum FpcDestinationAddressType _result;
HRESULT _hr = get_Type(&_result);
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _result;
}

le keyword switch requiert un int, mais je n'arrive pas à "caster" ce qui
est renvoyé par cette fonction en un int.
Si je cast en int alors j'ai :

switch ( (int) fpcDestination->Type )

msfpccom.tli(3554) : error C2556: 'GetType' : overloaded functions only
differ by return type
msfpccom.tli(3554) : error C2371: 'GetType' : redefinition; different basic
types

Pourquoi donc ?

10 réponses

1 2
Avatar
Alni
Bonjour,


Ha, Type est une fonction. Que se passe-t-il avec ceci ?

switch ( fpcDestination->Type() )
^^


Non, 'Type' n'est pas une fonction, mais une propriete qui masque
un acces a GetType() ou SetType(). C'est une extension Microsoft
au langage C++.


Exactement.


Avatar
Alni
Bonjour,


Alni wrote:
Bonjour,

J'ai un petit soucis avec les types.

switch ( fpcDestination->Type ) //*ICI* ça coince


Une chose de ce genre ne marcherait pas mieux ? (non testé)

HRESULT hr;
FpcDestinationAddressType DestType;
hr = fpcDestination->get_Type(&DestType);
if (FAILED(hr)) TraitementErreur();
switch(DestType)


J'y ai bien pensé, mais le compilo refuse :

FpcDestinationAddressType DestType; //undefined type
FpcDestinationAddressType

Bien que, comme je l'ai mentionné plus haut, ce type est présent dans
les tlh et tli.


Avatar
Alni
Bonjour,


Tiens compte éventuellement d'un cas par défaut, ainsi que de break
à la fin de chaque cas.


Oui, bien sûr...

Remarque, j'aurais pu oublier ce genre de détails, mais pas aujourd'hui.
Je ne code pas très souvent, mais je fais quand même 2 ou 3 appli en
C/C++ par an depuis 1987.

Bon, enfin merci à tous pour votre aide, je vais encore creuser...
Mais s'il vous vient une idée, n'hésitez pas.

Avatar
drkm
"Alni" writes:


Tiens compte éventuellement d'un cas par défaut, ainsi que de break
à la fin de chaque cas.


Oui, bien sûr...

Remarque, j'aurais pu oublier ce genre de détails, mais pas aujourd'hui.
Je ne code pas très souvent, mais je fais quand même 2 ou 3 appli en
C/C++ par an depuis 1987.

Bon, enfin merci à tous pour votre aide, je vais encore creuser...
Mais s'il vous vient une idée, n'hésitez pas.


As-tu essayé le code que je t'ai donné ? D'après l'URL que tu avais
renseignée, ce devrait être bon.

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html


Avatar
drkm
"Alni" writes:

J'y ai bien pensé, mais le compilo refuse :

FpcDestinationAddressType DestType; //undefined type
FpcDestinationAddressType

Bien que, comme je l'ai mentionné plus haut, ce type est présent dans
les tlh et tli.


Et avec :

enum FpcDestinationAddressType type ;
^^^^

?

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html

Avatar
Alni
Bonjour,


"Alni" writes:

J'y ai bien pensé, mais le compilo refuse :

FpcDestinationAddressType DestType; //undefined type
FpcDestinationAddressType

Bien que, comme je l'ai mentionné plus haut, ce type est présent dans
les tlh et tli.


Et avec :

enum FpcDestinationAddressType type ;


Non, mais.... si j'ajoute FPCLib:: alors ça compile sans erreurs
fonctionne correctement, la variable type étant bien chargée avec la
bonne valeur selon la destination.

FPCLib::FpcDestinationAddressType type ;
fpcDestination->get_Type( &type );
switch (type)
.../...

Par contre, le code ci dessous ne passe pas :

FPCLib::FpcDestinationAddressType type ;
Type=fpcDestination->Type;

error C2556: 'GetType' : overloaded functions only differ by return type
error C2371: 'GetType' : redefinition; different basic types

Alors que normalement c'est comme ça que l'on devrait l'utiliser.
J'ai d'ailleurs dans mon code des :

for (long l=1;l<=fpcDestinationSet->Count;l++)

Qui passent très bien sans être obligé de recourir à l'appel de la
fonction interne get_Count pour charger la variable.
HRESULT get_Count(
long *plCount
);
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/isa/isaobj2_9o6c.asp

Bon, enfin, j'ai un workaround pour continuer d'avancer, mais je n'aime
pas trop passer par des artifices...


Avatar
drkm
"Alni" writes:

Non, mais.... si j'ajoute FPCLib:: alors ça compile sans erreurs
fonctionne correctement, la variable type étant bien chargée avec la
bonne valeur selon la destination.

FPCLib::FpcDestinationAddressType type ;
fpcDestination->get_Type( &type );
switch (type)
.../...

Par contre, le code ci dessous ne passe pas :

FPCLib::FpcDestinationAddressType type ;
Type=fpcDestination->Type;
^^^


Je ne sais pas si c'est une erreur de recopiage, mais tu as ici une
majuscule, et à la déclaration une minuscule.

error C2556: 'GetType' : overloaded functions only differ by return type
error C2371: 'GetType' : redefinition; different basic types

Alors que normalement c'est comme ça que l'on devrait l'utiliser.


Si tu veux utiliser les properties (c'est bien cela ?) de Visual
C++, alors tu dois te renseigner auprès d'utilisateurs de ce compilo.
Ici, on ne connait pas.

[...]

Bon, enfin, j'ai un workaround pour continuer d'avancer, mais je n'aime
pas trop passer par des artifices...


Un appel de fonction membre, un artifice ?

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html

Avatar
Alni
Bonjour,


Type=fpcDestination->Type;
^^^


Je ne sais pas si c'est une erreur de recopiage, mais tu as ici une
majuscule, et à la déclaration une minuscule.


Oui erreur de recopie.

Un appel de fonction membre, un artifice ?


Bah, normalement je devrait pouvoir atteindre tout simplement le membre
"Type", sans passer par get_Type() sous la forme fpcDestination->Type,
comme je le fais pour atteindre toutes les autres properties.

Mais bon... je commence à me demander si je ne vais pas me mettre au
Visual Basic...
Maintenant, j'ai un pb avec le count (fpcDestinationSet->Count), qui
s'avère être un long, mais qui ne contient pas plus que 255 :)

(valeur utilisée = nb d'éléments % 256)


Avatar
drkm
"Alni" writes:


Un appel de fonction membre, un artifice ?


Bah, normalement je devrait pouvoir atteindre tout simplement le membre
"Type", sans passer par get_Type() sous la forme fpcDestination->Type,
comme je le fais pour atteindre toutes les autres properties.


Mais s'il faut qualifier d'artifice un appel de fonction membre ou
l'accès à une « property », en C++, ...

Mais bon... je commence à me demander si je ne vais pas me mettre au
Visual Basic...


...

Maintenant, j'ai un pb avec le count (fpcDestinationSet->Count), qui
s'avère être un long, mais qui ne contient pas plus que 255 :)

(valeur utilisée = nb d'éléments % 256)


--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html


Avatar
M. B.
"Alni" a écrit dans le message de news:
cds9j1$jss$
Bonjour,


Mais bon... je commence à me demander si je ne vais pas me mettre au
Visual Basic...



Pour ma part, je choisirais plutot C# et .NET ...

MB

1 2