2013-07-31 1 views
3

J'ai créé un objet COM basé sur C++ à l'aide de Visual Studio 2012. Il s'enregistre et fonctionne correctement sur les machines 64 bits (appelées par le code 32 bits et appel 32 -bit serveur COM hors processus) mais ne s'enregistre pas sur les machines 32 bits (ni XP ni Win7 32 bits). Le message de regsvr32 estImpossible d'enregistrer la DLL COM construite avec VS2012/VC++ sur une machine 32 bits

LoadLibrary("comobj.dll") failed - The specified procedure could not be found. 

Le projet a été initialement créé avec Visual Studio 6 (il y a 7 ans). Il utilise des macros ATL telles que BEGIN_COM_MAP et BEGIN_SINK_MAP pour déclarer son implémentation de différentes interfaces. Il a dû être recompilé car le serveur COM qu'il invoquait a été modifié (nouveau ProgID, nouveau GUID, nouvelle bibliothèque de types, etc.). En dehors de ces ajustements, et en utilisant VS actuel, il n'y avait pas de changements (intentionnels) - il n'y avait certainement rien dans l'ancien équivalent du fichier projet qui aurait pointé vers 64 bits.

L'examen de la DLL avec la version 64 bits de DEPENDS.EXE affiche des icônes "64" à côté des DLL référencées standard comme KERNEL32 et USER32. Autre que d'avoir construit la DLL sur une machine 64 bits, il n'y a rien de "64 bits" sur la DLL que je puisse trouver. La cible est explicitement Win32 (pas X64). L'examen de la DLL avec la version 32 bits de DEPENDS.EXE (sous Windows XP s'exécutant sous Virtual PC) montre KERNEL32.DLL avec une icône rouge, apparemment parce qu'il existe des références à FlsAlloc FlsFree FlsGetValue FlsSetValue qui n'existent pas dans le KERNEL32.DLL 32 bits. (Je ne sais pas ce que sont et ne savent pas d'où viennent ces références - peut-être de la copie de MFC sur la machine 64 bits où la compilation a été faite?)

Serait-ce que je dois installez VS2012 sur XP et recompilez-vous là? Comment cela pourrait-il vraiment être ce qui doit être fait pour construire un objet COM Win32 en C++ en utilisant Visual Studio actuel?

Est-ce que quelqu'un sait où je pourrais regarder? J'ai vérifié toutes les options de projet et de solution et rien ne semble réglé sur 64 bits. L'option "Utilisation de MFC" est définie sur "Utiliser les bibliothèques Windows standard" - c'est probablement la solution, mais si ce n'est pas portable sur Windows 32 bits, elle n'utilise pratiquement que des "bibliothèques standard". (Je vais essayer des changements à cela après l'envoi de ceci.)

Merci d'avance pour tout conseil.

+0

Construire avec Visual Studio 2012, vous devez utiliser le jeu d'outils ['v110_xp'] (http://msdn.microsoft.com/en-us/library/vstudio/jj851139.aspx) pour rester compatible avec XP. –

+0

Merci pour cette information. Je mettrai à jour ceci quand j'apprendrai que c'était tout ce que je devais faire pour réparer ceci. –

+0

En utilisant cette information, j'ai réussi à faire fonctionner les choses.S'il vous plaît ajouter une réponse avec la même information (supprimer le commentaire si vous le souhaitez) et je vais le marquer comme tel - c'est le moins que je puisse faire car vous m'avez sauvé beaucoup de temps en me montrant dans la bonne direction. –

Répondre

3

Le jeu d'outils par défaut livré avec Visual Studio 2012 produit des résultats incompatibles avec Windows XP, en utilisant certaines API présentées seulement plus tard avec Vista. Pour utiliser à la fois la puissance et la richesse des fonctionnalités du dernier compilateur Microsoft C++ et être toujours compatible avec Windows XP, vous devez utiliser un autre nom de code d'outils "v110_xp" introduit avec Visual Studio 2012 Update 1. Au La dernière mise à jour disponible est Visual Studio Update 3, et vous pouvez installer simplement les dernières mises à jour disponibles pour Visual Studio.

Vous avez le paramètre disponible sous Paramètres du projet:

enter image description here

Voir plus ici: Configuring C++ 11 Programs for Windows XP.

+0

Vous avez raison, mais son problème principal est qu'il n'a pas encore de * mises à jour * installées. Il utilise toujours la version RTM du CRT, celle qui dépend directement de FlsAlloc(). Vous pouvez recommander [ce lien] (http://www.microsoft.com/en-us/download/details.aspx?id=39305) –

+0

@HansPassant: Bien sûr, j'ai mentionné la mise à jour 1 mais il est logique d'installer la dernière mise à jour , qui est la mise à jour 3. J'ai ajouté le lien ci-dessus, merci. –

+0

J'ai facilement trouvé "mise à jour 3" lors de la recherche de mises à jour VS2012 - cette réponse était précieuse dans la mesure où elle m'a indiqué exactement dans la bonne direction. J'ai eu de la chance de ne pas avoir demandé cela pendant le temps après que "update 2" soit apparu, brisant le support XP fourni par "update 1". Le travail que je devais faire pour faire fonctionner les choses était trivial. Le plus grand mystère est comment VS2012 RTM pourrait par défaut "pas de support pour XP (pour C++)" sans - par exemple - vous avertir du problème lorsque vous avez installé le support pour C++. –

Questions connexes