2016-05-10 9 views
1

Это приложение должно работать в Windows 7, поэтому оно определяет «#define _WIN32_WINNT _WIN32_WINNT_WIN7». PathAllocCanonicalize - Windows 8 [desktop apps only], но сборка работает, поэтому неожиданность появляется позже во время выполнения на Win7: приложение не может запускаться, потому что отсутствует «api-ms-win-core-path-l1-1-0.dll». Заголовок, Pathcch.h, определяет что-то:Разрыв сборки для несовместимых версий Windows: функции Pathcch.h

/* APISET_NAME: api-ms-win-core-path-l1 */ 

#ifndef _APISET_PATH_VER 
#ifdef _APISET_MINCORE_VERSION 
#if _APISET_MINCORE_VERSION >= 0x0100 
#define _APISET_PATH_VER 0x0100 
#endif 
#endif 
#endif 

Его можно использовать ... как-то? Или, если это оболочка, могу ли я установить что-то в Windows 7 за то, что она работает?

РЕДАКТИРОВАТЬPathAllocCanonicalize в Pathcch.h, который игнорирует _WIN32_WINNT.

+0

Связанный: http://stackoverflow.com/questions/24131602/how-to-load-pathcchcanonicalizeex-at-run-time – Liviu

+0

Запустите 'dumpbin/import' на скомпилированном двоичном файле. Я был бы готов поспорить, что библиотека связана. Если это так, вам нужно вытащить ссылку во время выполнения, используя 'LoadLibrary' и' GetProcAddress' – theB

+0

. Что мне интересно, если сборка может быть нарушена, поэтому я может обнаружить раннюю проблему вроде этого. Это намерение '_WIN32_WINNT', так почему же нет функций' Pathcch.h'? – Liviu

ответ

0

В макросах версии нет магии компилятора; все, что происходит в том, что вместо того, чтобы

extern void f(void); 

в заголовочных файлах, Microsoft имеет

#if _VERSION >= _MIN_VERSION 
extern void f(void); 
#endif 

(или что-то подобное). Это использует препроцессор в качестве фильтра, делая функции необъявленными на неподдерживаемых системах (поэтому вы получаете предупреждение компилятора о необъявленных символах).

Таким образом, вы можете просто сделать это самостоятельно в собственных файлах заголовков проекта. Директива #error (которая является частью стандартных C и C++) выплевывает ошибку компилятора с сообщением по вашему выбору. Так как вы уже решили #define _WIN32_WINNT _WIN32_WINNT_WIN7 в источнике, вы можете вставить что-то подобное в одном из собственных заголовочных файлов вашего проекта, такие как stdafx.h:

#if _WIN32_WINNT < _WIN32_WINNT_WIN8 
#error Sorry, this program requires Windows 8 or newer. 
#endif 

(Вы должны заменить фактическую величину _WIN32_WINNT_WIN8, если вы помещаете это до #include <windows.h>.) После включения этих строк первый исходный файл с этим заголовочным файлом приведет к ошибке, если кто-то изменит _WIN32_WINNT на значение, меньшее, чем Windows 8.

Надеюсь, это подойдет твои нужды.

+0

Я не вижу, как это может помешать кому-то включать «Pathcch.h» в другое место и использовать его. Я думал, что ваше предложение состояло в том, чтобы включить включение заголовка в stdafx.h вместе с проверкой _WIN32_WINNT. – Liviu