Passage de VS2002 à VS2005 erreur compilation!

Delirium6
Passage de VS2002 à VS2005 erreur compilation!

Bonjour,

Je suis en train de migrer mon application comme indiqué dans le sujet, et je bloque sur cette erreur :

c:\dynaxa_projects\inboxshield 4.0\inboxshield\InboxShield_p.c(95) : fatal error C1189: #error :  You need a Windows 2000 or later to run this stub because it uses these features:
InboxShield_i.c
Generating Code...

Je suis sur Vista et mon application et déstiné à celui-ci!

J'ai recherché sur le web mais j'ai rien trouvé qui puisse encore m'aider!

Merci d'avance!

fredericmazue

error C1189 est un message d'erreur utilisateur destiné à être émis à la compilation. On trouve ça en général dans les en-têtes lorsque le type qui a écrit le code veut émettre un message d'erreur au moment de la compiilation si on n'est pas sur la bonne plate-forme ou si une macro n'est pas définie, etc. Par exemple:

// mon_en_tete.h
#ifndef WIN32
#error ce programme doit être compilé sous Windows
#endif

Pour une raison ou pour une autre (à voir dans l'en-tête concerné) une macro n'est pas définie correctement.
Si ça se trouve il suffit de la rajouter en amont à la compilation. Parce que en migrant peut être que tu n'utilises pas un autre entête dans lequel la macro aurait été définie. Ou une autre raison. Il n'y a que celui qui a la code qui peut voir.

Si ça se trouve aussi, il te suffit de supprimer l'équivalent de ce que je donné plus haut comme exemple de l'en-tête pour que ça marche.

Enfin faut voir, mais avec ces infos, je pense que ut verras facilement.

Delirium6

fredericmazue wrote:

Si ça se trouve aussi, il te suffit de supprimer l'équivalent de ce que je donné plus haut comme exemple de l'en-tête pour que ça marche.

En fait j'ai bien fait cela ainsi mon programme compile mais apres il ne fonctionne pas! donc je dois trouver l'autre solution !

l'entete que j'ai supprimée est la suivant :

#if !(TARGET_IS_NT50_OR_LATER)
#error You need a Windows 2000 or later to run this stub because it uses these features:
#error   /robust command line switch.
#error However, your C/C++ compilation flags indicate you intend to run this app on earlier systems.
#error This app will die there with the RPC_X_WRONG_STUB_VERSION error.
#endif

pour l'option /robust, si je l'enleve cela fait exactement commme quand je supprime la partie ci-dessus!

il faut donc que je trouve la macro qui me pose problème mais ou chercher ce n'est pas moi qui crée ce programme a l'origine!

fredericmazue

Quote:
il faut donc que je trouve la macro qui me pose problème

Elle est toute trouvée, c'est:
TARGET_IS_NT50_OR_LATER

Donc tu peux faire un essai de compilation en la forçant dans les options du projet (preprocessor)
MAIS
Maintenant que tu nous en dit un peu plus, "forcer" n'est sans doute pas la bonne solution. La bonne solution doit se trouver dans les options de compilation du projet. D'ailleurs c'est ce que dit le message d'erreur
"However, your C/C++ compilation flags indicate you intend to run this app on earlier systems. "

Faudrait voir quels sont les flags de compilation employés. En outre maintenant que tu donnes le message d'erreur complet (pourquoi pas avant :?: ) il est clair que du RPC ou du ATL est en cause là-dedans (toujours ton programme Windows mail ? c'est le Inbox qui me fait dire ça)

Tu ne peux pas enlever /robust comme ça. Tu penses ça doit avoir une répercussion sur la compilation des interfaces IDL ce n'est pas innocent. Et compiler de l'ATL/COM n'est pas une mince affaire.

Donc moi je ferais deux essais:

D'abord remplacer /robust par /no_robust

Ensuite forcer TARGET_IS_NT50_OR_LATER

Et si ça ne vas toujours pas, alors je crois que je reprendrais le corps du code, mais en demandant à Visual de générer un squelette de projet ATL pour accueillir le code à migrer.
Mais même comme ça. Si c'était pour XP ok, mais pour Vista tu risques de ne pas être au bout de tes surprises; Enfin je ne veux pas te porter la poisse :)
Fais d'abord les 2 essais et dis nous comment ça va.

Et si par malheur ça ne va pas, vielle bien à ne pas donner de demi messages d'erreur.

Delirium6

Quote:

D'abord remplacer /robust par /no_robust

Ensuite forcer TARGET_IS_NT50_OR_LATER

Si je met le /no_robust ca compile mais cela ne se passe pas bien du tout à l'éxècution!

Et pour le forcage j'obtiens les erreurs suivantes qui ne change rien !

Compiling...
InboxShield_i.c
c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcndr.h(125) : warning C4005: 'TARGET_IS_NT50_OR_LATER' : macro redefinition
        command-line arguments : see previous definition of 'TARGET_IS_NT50_OR_LATER'
dlldatax.c
c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcndr.h(125) : warning C4005: 'TARGET_IS_NT50_OR_LATER' : macro redefinition
        command-line arguments : see previous definition of 'TARGET_IS_NT50_OR_LATER'
c:\dynaxa_projects\inboxshield 4.0\inboxshield\InboxShield_p.c(95) : fatal error C1189: #error :  You need a Windows 2000 or later to run this stub because it uses these features:
Generating Code...

Et oui c'est toujours pour l'application pour windows mail que je porte a VS 2005 car c'est le seul VS presque compatible Vista! :D

fredericmazue

Quote:
Si je met le /no_robust ca compile mais cela ne se passe pas bien du tout à l'éxècution!

Damned :!:

Quote:
Et pour le forcage j'obtiens les erreurs suivantes qui ne change rien !

Peut être n'as tu pas redéfini au bon endroit.
Dans mon prmeeir post, j'avais parlé d'amont, mais c'était avant de savoir qu'on était en COM.
le message te dit que la macro est redéfinie dans rpcndr.h c'est à dire en aval d'une définition au niveau d'une option de compilation.
Pour essayer tu dois toi même être en aval dans rpcndr.h
Etant entendu qu'une telle bidouille n'a que peu de chances de marcher.

Quote:

Et oui c'est toujours pour l'application pour windows mail que je porte a VS 2005 car c'est le seul VS presque compatible

Tout le problème est dans le presque... :(
On a dejà vu un gros problème avec ton appli à savoir une interface COM non implémentée dans Vista. Même si tu arrives à forcer la compilation, il n'y a (AMHA) rien qui te garantisse que ça marche. D'ailleurs si ça se trouve la compilation avec /no_robust est correcte, mais ça ne peut quand même pas marcher. Il semble que sous Vista, toute la plomberie COM a été revue. Si ça se trouve il y a des choses qui ne seront pas compilables tant qu'Orcas, avec les en-têtes "qu'il faut", ne sera pas disponbile. A moins peut être de se procurer les bons en-têtes dans une SDK, mais là faudra que le compilateur accepte de les compiler ce qui n'est pas non plus garanti. Ca vaut quand même le coup de farfouiller un peu dans la MSDN je pense.

En tous cas, s'il y a quelque chose que je retiens de tes mésaventures, c'est que pour l'instant il faut absolument se tenir à l'écart de COM/Vista. Heureusement je travaille sous Linux en ce moment (ouf).
Bon courage et tiens nouis au courant.
On va peut être quand même te trouver une solution.

Delirium6

Quote:
Si ça se trouve il y a des choses qui ne seront pas compilables tant qu'Orcas, avec les en-têtes "qu'il faut", ne sera pas disponbile.

Orcas, je viens de chercher et vois qu'il s'agit du nouveau VS07 special Vista!
Je me demande alors si je ne devrais pas attendre sa sortie et passer mon appli directement dessus (tant qu'a me faire c....! autant que se soit sur lla derniere version de VS)
Savez-vous pour quand elle est prevue?

fredericmazue

Quote:
Orcas, je viens de chercher et vois qu'il s'agit du nouveau VS07 special Vista!

Oui :)

Quote:
Je me demande alors si je ne devrais pas attendre sa sortie et passer mon appli directement dessus (tant qu'a me faire c....! autant que se soit sur lla derniere version de VS)

D'autant plus qu'étant donné ce qu'est ton application, il est possible que ça soit un passage obligé.
Quote:
Savez-vous pour quand elle est prevue?

Je ne sais pas, mais il doit être possible de trouver la date quelque part sur le site de Kro$oft.
Ca ne devrait pas tarder en principe.
Mais si tu as le goût du risque, tu peux télécharger une bêta ici
http://www.microsoft.com/downloads/details.aspx?FamilyId=B533619A-0008-4DD6-9ED1-47D482683C78&displaylang=en
Quant à savoir si tu ne te feras pas c... comme tu dis, je ne peux rien te promettre...
Delirium6

Bon je vais voir mais je pense que je gouter au risque!

Sinon j'ai trouvé le fameux fichiers ou le _WIN32_WINNT etait definie est effectivement cela ne concordait pas!

// wrapper for dlldata.c

#ifdef _MERGE_PROXYSTUB // merge proxy stub DLL

#define REGISTER_PROXY_DLL //DllRegisterServer, etc.

#define _WIN32_WINNT 0x0400	//for WinNT 4.0 or Win95 with DCOM
#define USE_STUBLESS_PROXY	//defined only with MIDL switch /Oicf

#pragma comment(lib, "rpcndr.lib")
#pragma comment(lib, "rpcns4.lib")
#pragma comment(lib, "rpcrt4.lib")

#define ENTRY_PREFIX	Prx

#include "dlldata.c"
#include "InboxShield_p.c"

#endif //_MERGE_PROXYSTUB

En remplacant par 0x0500 cela compile bien que j'ai une erreur pour chacune de mes solutions :

Embedding manifest...
Performing registration
Project : error PRJ0019: A tool returned an error code from "Performing registration"

Par contre, mon programme ne fonctionne toujours pas alors que celui compilé sous VS2002 sur Vista fonctionne! Mais je pense que tout viens du dernier SDK!

fredericmazue

Quote:
A tool returned an error code from "Performing registration"

Hou là là c'est pas bon du tout ça se pense. Ca veut dire que les composants COM faisant partie de ton application ne s'enregistrent pas correctement. Aucune chance que quelque chose fonctionne derrière un message pareil :(

Quote:
Mais je pense que tout viens du dernier SDK!

Sans être sûr, ça se pourrait bien.
Mais en attendant Orcas, si ça fonctionne quand c'est compilé sous 2002, pourquoi tu te fatigues à compiler sous 2005. Je perds un peu le fil là. :P

Delirium6

C'est vrai mais je veux regler mon problème avec l'UAC, qui bloque mon application!

Mais il n'y a vraiment aucune doc qui expliquerait de maniere explicite comment il faut procéder pour rendre son application compatible vista!

fredericmazue

Quote:
C'est vrai mais je veux regler mon problème avec l'UAC, qui bloque mon application!

P.... quel cauchemar.
Heu méfie toi.
Est-ce que recompiler pour Vista résoudra le problème avec l'UAC ? Pas sûr.
Remarque là je parle sans savoir, vu que je n'ai pas de Vista. Mais disons qu'une longue expérience de développement Windwos m'a appris à être méfiant.

Quote:
Mais il n'y a vraiment aucune doc qui expliquerait de maniere explicite comment il faut procéder pour rendre son application compatible vista!

Tu ne peux trouver ça que dans la MSDN.
En théorie le problème est tout simple.
Ton appli utilise des composants COM
- Si compilé sous 2002, je suppose qu'un "mode de compatibilité" se met en route et ton appli marche (tant bien que mal si je comprends bien)

- sous Vista: tu dois compiler les composants COM "proprement". Et pour ça dans l'idéal il te faut l'EDI (Orcas) ou sinon la dernière MSDN en supposant bien quelle soit à jour à ce niveau ce qui n'est pas forcément certain. Elle le sera avec la sortie d'Orcas, mais avant c'est pas sûr. On se rappelle le problème que tu as déjà eu avec un fichie rmanquant :(
Il semble que ton ancienne appli vienne avec des fichiers générés (dlldata.c) Ils ont été générés par l'ancien IDE/Librairies ATL et ils ne sont pas à niveau pour Vista comme on vient le voir.
Si tu n'as pas Orcas, la seule solution (AMHA) est, comme je te l'ai déjà dit dans un post précédent, sous Visual 2005, de générer un projet ATL vide et de compiler. En principe tu pourras à ce moment vérifier que les macros __WIN32_WINNT 0x0500 sont bien là. Ce qui voudras dire que tu es au moins ok pour le 2000 et donc ton problème tel que présenté initialement dans ton premier post sera réglé (ce qui ne veut pas dire que ton pb UAC le sera, tu me comprends bien n'est-ce pas ?)
A partir de là tu devras incorporer le code de ton application manuellement, éventuellement à chaque fois en demandant au wizard de te générer la classe COM/ATL qui faut.

Oui c'est un boulot horrible et sans garanties, mais puisque l'importation du projet de 2002 vers 2005 n'a pas marché comme il le fallait, je ne vois rien d'autres à faire.

Et de toutes façons avec Orcas, tu va sans doute tomber dans une galère équivalente. La seule satisfaction étant au final de compiler spécifiquement pour Vista.

En tout cas je ne vois pas d'autre solution. Ou je n'ai pas une bonne vision du problème. C'est possible aussi. Peut être que quelqu'un d'autre auras une solution pour toi. Je le souhaites sincèrement.

Sinon, peut être en attaquant le problème par l'autre bout. Il y a peut être un moyen de faire taire l'UAC. Mais je ne sais pas.
La seule chose que je sache à propos de l'UAC est qu'elle a déjà rendu fous pleins de gens. Les HP refusent du monde :(

Delirium6

Quote:
Les HP refusent du monde :(

C'est quoi ça les HP?

Pour Orcas, je l'ai téléchargé et mais il ont mis cela dans une machine virtuelle ce qui est tres lourd!!
J'ai compilé le projet 2005 aucune erreur mais toute mon interface ne marche pas ! :shock:

J'ai trouvé cela sur votre site qui reprend un peu un document du genre chez microsoft :
http://www.programmez.com/vista_article.php?id_article=10&&titre=Migration%20d%E2%80%99une%20application%20vers%20Windows%20Vista

Ce que je comprend pas c'est si on peut plus écrire dans le HKLM\SOFTWARE où on va écrire les données qui y étaient?
Idem pour ce qui est de l'écriture dans le Program Files! :mrgreen:

fredericmazue

HP = Hopitaux psychiatriques :)

Ah les machines virtuelles... c'est décidément toujours de plus en plus à la mode et toujours de plus en plus lourd :(

Désolé que ça ne marche toujours pas .

Pour le registre et le rep program files, je ne sais pas. Pour l'instant Vista, je me tiens sagement à l'écart.

Mais ce que je crois est qu'il existe une base de registre virtualisée, pour chaque utilisateur ou application je ne sais plus.
Tiens si ça se trouve, je viens d'y penser, c'est pour ça que ton appli ne marche pas . Normalement les composants COM sont enregistrés dans la base de registre. Mais pour toi peut être que c'est enregistré dans une base virtuelle et que tu tentes de l'utiliser dans une autre je ne sais pas. Enfin ce n'est qu'une hypothès au pif ce que je te dis là, ne le prends pas pour argent comptant.

Quote:
on peut plus écrire dans le HKLM\SOFTWARE où on va écrire les données qui y étaient?

Ce gros bouzin de base de registre est appelé à disparaître. Comment fera-t-on ? Comme on faisait avant, dans un fichier de configuration, dans un répertoire genre /etc ou un répertoire dédié à l'application.
C'est comme ça qu'on a toujours fait sous Unix/Linux

Et tu vas voir qu'à force d'évoluer et de faire des retours en arrière qui sont des pas en avant, Windows va finir par être Linux :lol: