因此,我有一个Visual 2013 Update 4解决方案,其中包含2个项目,一个是目标Windows8.1,另一个是配置为构建静态库的Windows 8.1。
项目是开源的,下面是参考的解决方案:https://github.com/gideros/gideros/tree/master/winrt
我需要做的是让它使用网络代码,它使用winsockets。因为这是一个库项目,所以在项目属性中没有链接器部分,所以我只包括
#include <WinSock2.h>
#pragma comment(lib, "Ws2_32.lib")这两个项目的构建都没有错误,当库包含在Windows应用程序中时,它完全按照预期工作,但在Windows应用程序网络部分不工作,但也没有错误或崩溃。
我通过运行了它,它说:
Error Found: The supported APIs test detected the following errors:
API WSACleanup in ws2_32.dll is not supported for this application type. 以及许多其他对ws2_32库的引用
我开始在互联网上搜索,有很多帖子说你不能在Windows8.1上使用winsocket,你必须使用微软的winrt套接字实现等等。
但后来我无意中发现,现在(从VS 2013年更新3起)可以在Windows8.1和Windows 8.1上使用winsock
http://blogs.windows.com/buildingapps/2014/10/13/winsock-and-more-open-source-for-your-windows-store-apps/
引用:
我们很高兴地宣布,从8月份发布的Visual 2013更新3(下载)开始,允许在Windows应用程序中使用WinSock API。由于WinSock已经被允许在Windows上通过认证,这项工作就完成了这个故事。现在,WinSock可以在Windows8.1、Windows 8.1和通用应用程序中普遍使用。
就像我和2013年更新4一样,它应该已经起作用了。因此,我检查了(它是3.3),它说它有可更新的版本,所以我从以下网站下载了WindowsSDKforWindows8.1:
https://dev.windows.com/en-us/develop/app-certification-kit
现在我甚至无法构建这个项目,因为它说Windows8.1目标中的所有Ws2_32.lib部件都丢失了。(虽然Windows 8.1仍然按预期构建和工作)
那么,在Windows8.1应用程序上甚至可以使用winsockets吗?如果是的话,我错过了什么?
更新1:
这似乎是可能的,但问题在于我的安排。
当我检查我的项目所指向的头文件时,它们是:
对于Windows phone,its
Program Files (x86)/Windows Phone Kits/8.1/Include/winsock2.h对于Windows it
Program Files (x86)/Windows Kits/8.1/Include/um/WinSock2.h当我检查Windows文件时,它定义了一个预处理器:
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)它不会进入if语句,因此对于编译器来说,这个文件基本上是空的。
我甚至试着卸载Windows8.1SDK,它没有改变任何东西。
然后,我从Program文件夹中手动删除文件,并从
https://dev.windows.com/en-us/develop/app-certification-kit
不过,我的头还是一样的。那么,在哪里可以获得最新的Windows8.1SDK和适当的winsock2头文件呢?
更新2:
所以我删除了所有的东西,重新安装了干净的VS 2013 Express Update 4,同样的结果也是一样的,所有这些都是没有错误的,但是网络在Windows8.1应用程序上不起作用,而它在Windows 8.1上完美地工作。
就像Windows8.1只有空存根一样,什么也做不了。
在Windows论坛上,我一直在问,微软的一位代表引用了这样的话:
如果你有VS 2013更新4正确安装,那么你将得到一个更新的Windows8.1SDK。在该版本的winsock2.h中,只有大多数WinSock API的ASCII版本被排除在Windows之外。您必须将UNICODE专用于Windows 8商店应用程序。
不幸的是,我不知道这意味着什么,也不知道该如何进行。如果这意味着定义UNICODE宏,那么它已经被定义了。
更新3:
我已经成功地调试了winsocket代码,所有东西都按预期运行,服务器正在监听端口。但没有什么能连接到它。就像它在沙箱模式下运行
更新4:
运行netstat和wireshark似乎都是正确的,可以看到服务器,甚至可以从其他计算机连接到它。但我不能用同一台电脑连接。
而且,似乎MS禁止Windows应用程序与同一台计算机上的桌面应用程序通信
我不知道为什么,有人能提供任何见解吗?
How can a Metro app in Windows 8 communicate with a backend desktop app on the same machine?
最后一个问题是
如果VS 2013更新4捆绑使用WACK3.3构建的不允许winsockets的winsock2头,而Windows8.1SDK更新有允许套接字API的WACK3.4,但是绑定不构建的旧winsock2头。
如何通过正确的winsock2设置获得WACK3.4?
发布于 2015-04-19 18:00:19
因此,套接字基本上是起作用的,但是有几种情况需要注意。
存在一个网络隔离,它不允许从同一台机器连接到Windows应用程序(就像我在测试中所做的那样,我认为网络不起作用)。
但是,如果您可以从远程机器连接,一切正常工作。
有关这方面的更多信息:
但是您仍然无法通过WACK (WACK不需要提交存储,但仍然需要提交)
问题是VS 2013更新4捆绑了构建和工作的winsock2头,并且它有WACK3.3不允许winsockets的软件。
Windows8.1SDKUPDATE有WACK3.4,它允许套接字API,但是捆绑了不构建和工作的旧的winsock2头。
由于您不需要运行WACK来提交应用程序,这基本上没有问题,但由于我需要检查是否有其他特定的库可以禁止,所以我必须从这里安装Windows 8.1 SDK中的单个(应用程序认证)组件:
https://dev.windows.com/en-us/develop/downloads
我现在有了WACK 3.4和合适的套筒
然而,网络隔离仍然太糟糕了,这基本上扼杀了我最初移植的目的。使所有的工作基本上徒劳无功。
发布于 2015-04-18 18:10:50
Windows和Windows支持WinSock,并允许使用WACK3.4。它既可以使用#pragma comment(lib, "ws2_32.lib"),也可以直接将ws2_32.lib添加到项目设置中。
看起来升级后构建项目的方式有问题,您能在升级后发布错误吗?
https://stackoverflow.com/questions/29717190
复制相似问题