2016-07-20 36 views
0

我正在编写一个需要在Windows 7,8.x和10上运行的程序。该程序有一个依赖于仅在Windows 10上可用的Windows API的功能(相对次要)。此功能在Win7上显然不起作用,在调用这些API之前,我确保当前的操作系统是Windows 10.api-ms-win-core-winrt-string-l1-1-0.dll从您的计算机中丢失

In为了使用这些API,我不得不将VS2015项目配置为“使用Windows运行时扩展”(/ ZW)并将“目标平台版本”设置为10.0.10586.0。

但是,当我尝试在Windows 7上运行应用程序时,会导致问题。我收到一个错误对话框,提示“程序无法启动,因为api-ms-win-core-winrt-string-l1-1您的计算机中缺少“-0.dll”。我试图在Win7机器上安装VS2015可再发行组件包,但是这并没有解决问题。

关于如何让它在Win7上运行的任何想法?我真的不想改变我的所有代码来动态加载所有的Windows 10功能。

该程序是用C++编写的,而我使用的Windows API来自Windows.Devices.WifiDirect命名空间。

+0

任何API这真的是关于C#Ò而不是C++?你使用的是什么API?可能有一种解决方案适用于经典的桌面应用程序。 –

+1

仅限Windows 10应用程序的一个明显限制。不管你的善意是什么,它都行不通。 –

+1

C#程序的一个很好的功能是它只在你使用他们的代码时加载DLL。用[MethodImpl(MethodImplOptions.Noinlining)]修饰方法是最好的。但显然你不是在谈论C#,/ ZW选项是一个C++/CX编译选项。从C#调用WinRT/UWP方法也很容易,但是您必须手动编辑项目文件以添加所需的元素。现在您添加对WinRT库的引用。 –

回答

1

我最终解决了这个问题,将我所有的Win10-only API调用转换成了一个用/ ZW编译的代理DLL。然后,我从主程序中删除了/ ZW开关,然后允许它在Windows 7下运行。当我的程序在Windows 10机器上运行时,代理DLL仅被加载(使用LoadLibrary()调用)。

这解决了这个问题。我不得不为DLL编写一些代理函数,但是它的开销要远远低于所有仅用于Win10的API调用。

我仍然希望听到更好的解决方案,如果有的话。

1

通过使用“ABI”API,可以在不使用/ ZW开关的情况下访问Windows 10 API。更多细节在这里:

https://blogs.msdn.microsoft.com/oldnewthing/20160629-00/?p=93775

你必须通过调用LoadLibrary/GetProcAddress的使用,如“RoGetActivationFactory”和“WindowsCreateString”的API,因为你不能链接到他们,因为他们是不提供的Windows 7不要忘记定义WINVER和_WIN32_WINNT到Windows 7:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa383745(v=vs.85).aspx

,让你不链接到在Windows 7上不可用