首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使Ws2_32.lib与针对Windows8.1的VS 2013项目协同工作

如何使Ws2_32.lib与针对Windows8.1的VS 2013项目协同工作
EN

Stack Overflow用户
提问于 2015-04-18 12:14:15
回答 2查看 6K关注 0票数 1

因此,我有一个Visual 2013 Update 4解决方案,其中包含2个项目,一个是目标Windows8.1,另一个是配置为构建静态库的Windows 8.1。

项目是开源的,下面是参考的解决方案:https://github.com/gideros/gideros/tree/master/winrt

我需要做的是让它使用网络代码,它使用winsockets。因为这是一个库项目,所以在项目属性中没有链接器部分,所以我只包括

代码语言:javascript
复制
#include <WinSock2.h>
#pragma comment(lib, "Ws2_32.lib")

这两个项目的构建都没有错误,当库包含在Windows应用程序中时,它完全按照预期工作,但在Windows应用程序网络部分不工作,但也没有错误或崩溃。

我通过运行了它,它说:

代码语言:javascript
复制
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

代码语言:javascript
复制
Program Files (x86)/Windows Phone Kits/8.1/Include/winsock2.h

对于Windows it

代码语言:javascript
复制
Program Files (x86)/Windows Kits/8.1/Include/um/WinSock2.h

当我检查Windows文件时,它定义了一个预处理器:

代码语言:javascript
复制
#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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-19 18:00:19

因此,套接字基本上是起作用的,但是有几种情况需要注意。

存在一个网络隔离,它不允许从同一台机器连接到Windows应用程序(就像我在测试中所做的那样,我认为网络不起作用)。

但是,如果您可以从远程机器连接,一切正常工作。

有关这方面的更多信息:

https://msdn.microsoft.com/en-us/library/windows/desktop/dd374089%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

但是您仍然无法通过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和合适的套筒

然而,网络隔离仍然太糟糕了,这基本上扼杀了我最初移植的目的。使所有的工作基本上徒劳无功。

票数 0
EN

Stack Overflow用户

发布于 2015-04-18 18:10:50

Windows和Windows支持WinSock,并允许使用WACK3.4。它既可以使用#pragma comment(lib, "ws2_32.lib"),也可以直接将ws2_32.lib添加到项目设置中。

看起来升级后构建项目的方式有问题,您能在升级后发布错误吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29717190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档