2017-01-17 5 views
-1

« Le point d'entrée de procédure CreateFile2 ne pouvait pas se trouver dans la bibliothèque de liens dynamiques KERNAL32.dll »Création exe vcxproj dans Windows 7 SP 1: L'entrée de procédure <function> ne pouvait pas se trouver dans la bibliothèque de liens dynamiques KERNAL32.dll

Nous allons à un nouveau système, C++ construit par waf à Visual studio 2013 build (vcxproj), converti plusieurs projets déjà, mais ils sont tous à construire dll. Essayer de construire un projet de fichier exe externe a été un peu plus difficile. Au début, il n'a même pas le voir comme une application win32 (bien que je construis en x64) mais j'ajouté:

<IsLauncher>true</IsLauncher> 

qui semblait résoudre ce problème. Maintenant, je reçois cette erreur ci-dessus.

J'utilise un ancien plugin 3ème partie qui a un chemin logique qui utilise CreateFile2. J'ai le kit Windows 8.1 déjà installé sur ma machine (pour une raison quelconque) et il essaie d'utiliser Windows.h à partir de celui-ci. J'ai essayé, y compris Windows SDK \ 7.1A pour sa windows.h qui définit correctement mais les macros définies sal_supp.h que la sal.h VS 2013 a également défini une solution désoeuvrement.

J'ai examiné d'autres questions, mais ils semblent tous avoir des problèmes avec Win XP, rien sur Windows 7 tout à fait en forme. Et comme il s'agit de Kernel32, la plupart des autres questions ne semblent pas traiter des DLL système ou créer votre propre vcxproj. Tout cela a fonctionné quand je l'ai construit en waf, donc je sais que ce n'est pas vraiment quelque chose qui ne va pas avec n'importe quoi installé.

Stuff J'ai essayé:

<ClCompile><PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions></ClCompile> 

<PropertyGroup Label="Configuration"><UseOfMfc>Dynamic</UseOfMfc></PropertyGroup> 

<PropertyGroup><LinkIncremental>true</LinkIncremental></PropertyGroup> 

<Link><AdditionalDependencies>kernel32.lib;Ws2_32.lib;psapi.lib;zlib.lib;shlwapi.lib;...</AdditionalDependencies></Link> 

Je sais, pas une erreur d'éditeur de liens, mais cela valait la peine d'essayer.

+0

Il est au bas de l'article MSDN, « prise en charge minimum client". 8> 7. Appliquer le deux-par-quatre: ne ** pas ** cible Windows version 10 lorsque vous voulez que votre programme fonctionne sur Windows 7. –

+0

Désolé à l'origine, je pensais que cet ordinateur fonctionnait sous Windows 10 alors j'ai eu WINVER = 0x0A00 . Il s'avère donc que la raison pour laquelle la logique de code tente d'exécuter du code Windows 8 est que Windows 8.1 est installé sur le système et qu'il utilise Windows.h. J'ai essayé de le changer au windows.h Windows SDK \ 7.1A mais il a un sal_supp.h avec des macros qui définit les sont également définies dans le sal.h. VS 12.0 Me laissant dans un état différent. – Wildeflit

Répondre

0

Le CreateFile2 function a été ajouté dans Windows 8, de sorte que vous ne pouvez pas l'utiliser si vous avez encore besoin de compatibilité avec Windows 7.

Client minimum pris en charge Windows 8 [applications de bureau | applications Windows Store]

+0

Le code de la 3ème partie a une logique qui l'empêche d'être utilisé dans les fenêtres qui ne l'ont pas mais comme je l'ai dit plus haut dans le commentaire, Windows Kit 8.1 est installé et il essaie d'utiliser windows.h. Windows SDK \ 7.1A ne fonctionne pas avec VS 2013, il semble. – Wildeflit

0

CreateFile2 a été introduit dans Windows 8. La principale raison de l'utiliser est donc qu'une bibliothèque ou DLL passera WACK lorsqu'il est utilisé dans une application universelle Plate-forme Windows (UWP) qui ne permettra pas CreateFile . Une bonne façon de coder ce C++ est:

struct handle_closer { void operator()(HANDLE h) { if (h) CloseHandle(h); } }; 

typedef public std::unique_ptr<void, handle_closer> ScopedHandle; 

inline HANDLE safe_handle(HANDLE h) { return (h == INVALID_HANDLE_VALUE) ? 0 : h; } 

#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) 
     ScopedHandle hFile(safe_handle(CreateFile2(fileName, 
      GENERIC_READ, 
      FILE_SHARE_READ, 
      OPEN_EXISTING, 
      nullptr))); 
#else 
     ScopedHandle hFile(safe_handle(CreateFileW(fileName, 
      GENERIC_READ, 
      FILE_SHARE_READ, 
      nullptr, 
      OPEN_EXISTING, 
      FILE_ATTRIBUTE_NORMAL, 
      nullptr))); 
#endif 
     if (!hFile) 
     { 
      return HRESULT_FROM_WIN32(GetLastError()); 
     } 
     ... 

Le problème est ici si vous essayez de construire ce code avec un ancien SDK de Windows 7.1 ou une version antérieure parce _WIN32_WINNT_WIN8 n'est pas définie de sorte que vous finissez par prendre le premier cas, même quand tu ne veux pas. Si vous allez soutenir la construction de ce code dans des contextes autres que le SDK de Windows ou 8.x SDK de Windows 10, vous devriez aller avec ceci:

#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) 
+0

Merci, s'il ne s'agissait pas d'un code tiers, je l'utiliserais en permanence (il fournit un correctif temporaire pour le moment). Ils ont une logique pour l'empêcher d'être utilisé mais comme je l'ai commenté ci-dessus, Windows Kits 8.1 est installé et Windows.h est utilisé. J'ai essayé d'utiliser Windows SDK 7.1A windows.h mais il a essayé de redéfinir les macros dans sal.h de VS 2013. – Wildeflit