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
drkm
"Alni" writes:

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

error C2450: switch expression of type 'struct FPCLib::IFPCDestination *' is
illegal Integral expression required


FPCLib::IFPCDestinationSetPtr::Type est de type
FPCLib::IFPCDestination *. Un switch requière un type entier.

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

Avatar
Alni
"drkm" a écrit dans le message de
news:
"Alni" writes:

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

error C2450: switch expression of type 'struct FPCLib::IFPCDestination
*' is


illegal Integral expression required


FPCLib::IFPCDestinationSetPtr::Type est de type
FPCLib::IFPCDestination *.


Bah... Normalement cette fonction ne renvoie pas un pointeur, mais une
valeur comprise entre 0 et 2. Selon cette définition :
enum FpcDestinationAddressType {
fpcDestinationTypeDomain,
fpcDestinationTypeSingleIp,
fpcDestinationTypeIpRange
};

La doc de la fonction Type pour l'objet Destination se trouve là sur cette
page :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/isa/isaobj2_92ex.asp


Avatar
Alni
"Alni" a écrit dans le message de
news:cdr8fk$9ha$

"drkm" a écrit dans le message de
news:
"Alni" writes:

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





nb : en vbs cela s'utilise de cette façon (vu dans un script qui
fonctionne):

'Destination set info
Const Domain = 0
Const SingleIP = 1
Const IPRange = 2

Dim Dtype

For Each Destination in DestinationSet
DType = Destination.Type
Select Case DType
Case Domain
../..
Case SingleIP
../..
Case IPRange
.../..
End Select
Next

Se pourrait il que mon compilo déconne pour penser que cette fonction revoie
un pointeur alors que c'est une valeur entre 0 et 2, et que pourtant dans
les fichiers tli et tlh générés par l'import de la dll je retrouve bien :

#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;
}



Avatar
Eric P.
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)
{
case...


Eric

Avatar
M. B.
"drkm" a écrit dans le message de news:

"Alni" writes:

"drkm" a écrit dans le message de
news:

"Alni" writes:

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

error C2450: switch expression of type 'struct
FPCLib::IFPCDestination




*' is
illegal Integral expression required


FPCLib::IFPCDestinationSetPtr::Type est de type
FPCLib::IFPCDestination *.


Bah... Normalement cette fonction ne renvoie pas un pointeur, mais une


Où vois-tu une fonction ?

valeur comprise entre 0 et 2. Selon cette définition :
enum FpcDestinationAddressType {
fpcDestinationTypeDomain,
fpcDestinationTypeSingleIp,
fpcDestinationTypeIpRange
};

La doc de la fonction Type pour l'objet Destination se trouve là sur
cette


page :

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/isa/isaobj2


_92ex.asp

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++.

MB




Avatar
drkm
"Alni" writes:

"drkm" a écrit dans le message de
news:

"Alni" writes:

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

error C2450: switch expression of type 'struct FPCLib::IFPCDestination
*' is


illegal Integral expression required


FPCLib::IFPCDestinationSetPtr::Type est de type
FPCLib::IFPCDestination *.


Bah... Normalement cette fonction ne renvoie pas un pointeur, mais une


Où vois-tu une fonction ?

valeur comprise entre 0 et 2. Selon cette définition :
enum FpcDestinationAddressType {
fpcDestinationTypeDomain,
fpcDestinationTypeSingleIp,
fpcDestinationTypeIpRange
};

La doc de la fonction Type pour l'objet Destination se trouve là sur cette
page :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/isa/isaobj2_92ex.asp


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

switch ( fpcDestination->Type() )
^^

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



Avatar
Eric P.
M. B. wrote:
"drkm" a écrit dans le message de news:
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++.

MB


Ah, effectivement...
C'est le
#import "C:Program FilesMicrosoft ISA Servermsfpccom.dll"
qui va permettre au compilateur Microsoft de comprendre des raccourcis
soit-disant plus simples, mais en fait on ne sait absolument pas ce qui
se passe donc ça pose plus de problèmes que ça en résoud...

En principe ces #import ne sont jamais obligatoires, tu peux toujours
utiliser les objts COM dont tu as besoin de façon standard
(CoCreateInstance...).
J'avais utilisé un #import pour accéder à ADO à une époque comme dans
l'exemple de la MSDN, et finalement ne comprenant absolument pas les
bidouilles que ça impliquaient j'avais tout migré vers une solution
standard.

Eric


Avatar
drkm
"M. B." writes:

"drkm" a écrit dans le message de news:


"Alni" writes:

"drkm" a écrit dans le message de
news:

"Alni" writes:

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

error C2450: switch expression of type 'struct
FPCLib::IFPCDestination




*' is
illegal Integral expression required


FPCLib::IFPCDestinationSetPtr::Type est de type
FPCLib::IFPCDestination *.


Bah... Normalement cette fonction ne renvoie pas un pointeur, mais une


Où vois-tu une fonction ?

valeur comprise entre 0 et 2. Selon cette définition :
enum FpcDestinationAddressType {
fpcDestinationTypeDomain,
fpcDestinationTypeSingleIp,
fpcDestinationTypeIpRange
};

La doc de la fonction Type pour l'objet Destination se trouve là sur
cette


page :



http://msdn.microsoft.com/library/default.asp?url=/library/en-us/isa/isaobj2
_92ex.asp

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++.


D'après la page sus-citée, la syntaxe d'accès en C++ est :

C++ Syntax[C++]

HRESULT get_Type(
FpcDestinationAddressType *pDestType
);

La valeur de retour n'est pas documentée. Je vais ici considérer
qu'il s'agit d'un booléen indiquant si l'opération s'est bien passée.
À adapter évidemment en fonction du type et de la sémantique de la
valeur de retour. Bon, ceci devrait donc faire l'affaire :

FpcDestinationAddressType type ;

if ( ! fpcDestination->get_Type( & type ) ) {
// erreur ...
}

switch ( type ) {
case fpcDestinationTypeDomain :
// ...
case fpcDestinationTypeSingleIp :
// ...
case fpcDestinationTypeIpRange :
// ...
}

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

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





Avatar
M. B.
"drkm" a écrit dans le message de news:

"M. B." writes:

"drkm" a écrit dans le message de news:


"Alni" writes:

"drkm" a écrit dans le message de
news:

"Alni" writes:

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

error C2450: switch expression of type 'struct
FPCLib::IFPCDestination




*' is
illegal Integral expression required


FPCLib::IFPCDestinationSetPtr::Type est de type
FPCLib::IFPCDestination *.


Bah... Normalement cette fonction ne renvoie pas un pointeur, mais
une





Où vois-tu une fonction ?

valeur comprise entre 0 et 2. Selon cette définition :
enum FpcDestinationAddressType {
fpcDestinationTypeDomain,
fpcDestinationTypeSingleIp,
fpcDestinationTypeIpRange
};

La doc de la fonction Type pour l'objet Destination se trouve là sur
cette


page :




http://msdn.microsoft.com/library/default.asp?url=/library/en-us/isa/isaobj2


_92ex.asp

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++.


D'après la page sus-citée, la syntaxe d'accès en C++ est :

C++ Syntax[C++]

HRESULT get_Type(
FpcDestinationAddressType *pDestType
);

La valeur de retour n'est pas documentée. Je vais ici considérer
qu'il s'agit d'un booléen indiquant si l'opération s'est bien passée.
À adapter évidemment en fonction du type et de la sémantique de la
valeur de retour. Bon, ceci devrait donc faire l'affaire :

FpcDestinationAddressType type ;

if ( ! fpcDestination->get_Type( & type ) ) {
// erreur ...
}

switch ( type ) {
case fpcDestinationTypeDomain :
// ...
case fpcDestinationTypeSingleIp :
// ...
case fpcDestinationTypeIpRange :
// ...
}



HRESULT est un entier 32 bits contenant un code de retour.

MB






Avatar
M. B.
"Eric P." a écrit dans le message de news:
cdre8v$ebb$
M. B. wrote:
"drkm" a écrit dans le message de news:
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++.

MB


Ah, effectivement...
C'est le
#import "C:Program FilesMicrosoft ISA Servermsfpccom.dll"
qui va permettre au compilateur Microsoft de comprendre des raccourcis
soit-disant plus simples, mais en fait on ne sait absolument pas ce qui
se passe donc ça pose plus de problèmes que ça en résoud...

En principe ces #import ne sont jamais obligatoires, tu peux toujours
utiliser les objts COM dont tu as besoin de façon standard
(CoCreateInstance...).
J'avais utilisé un #import pour accéder à ADO à une époque comme dans
l'exemple de la MSDN, et finalement ne comprenant absolument pas les
bidouilles que ça impliquaient j'avais tout migré vers une solution
standard.

Eric


Pareil ...

MB



1 2