2009-02-16 220 views
0

我的应用程序可以在串行和套接字连接之间切换,但两者都不能同时打开。所以当我尝试在Socket与Serial之间切换时,我删除了Socket连接。基于套接字的对象使用一个名为UsesWinsock的私人类(这里大声喊出Len Holgate,因为它基本上是他的代码(实际上是RAII,但是直到我看到他这样做,我才将它应用到WSA))。这只是简单地调用WSAStart和WSACleanUp。WSACleanUp导致异常

当WSACleanUp被调用时,它会进入NTDLL和汇编程序。 @ err,hr给了我“传递给系统调用的数据区域太小”与HRESULT相同。

我试着移动代码:按继承顺序移动类会导致破坏序列发生变化,并且实际上破坏了函数,因此它们是在破坏序列中调用的最后一个东西。都没有工作。

我很确定我已经释放了所有分配的东西(只有一个套接字和几个事件),我被卡住了 - 这对我来说是一个相当重要的问题。

Google is unhelpful returning 4 results of which none solve my problem

有什么建议吗?

回答

1

那么,你使用我的UsesWinsock类吗?那是,你是说它坏了吗?如果是这样的直接发给我的电子邮件可能是解决问题的更有效的方式;)

我注意到我的代码实际上并没有检查来自dtor中WSACleanUp()的返回代码,所以我假设你正在检查这个,它是SOCKET-ERROR并且WSAGetLastError()报告了ERROR-INSUFFICIENT-BUFFER?

+0

我没有像现在这样使用你的课程,但它确实看起来很可疑。这里有一个关于使用外部代码的恐惧症,所以我不得不重写它。但是,一旦这个想法被播下,你怎么能不播下它? 实际的HRESULT错误在监视窗口中显示为@ err,hr。 CleanUp从来没有真正返回。 – 2009-02-16 12:04:29

+0

奇怪。我从来没有见过这种情况发生。在这次调用发生之前还有其他的事情正在卸载winsock dll吗?你还有其他的调用WSAStartup和WSACleanUp吗?什么是演示问题的最小示例程序; etc ... – 2009-02-16 12:44:39

0

我很想知道,如果你使用的重量 你会发现什么“跟踪,看数据”窗口中的调试器命令:

设置在WSACleanup开始时的断点:

 
bp ws2_32!wsacleanup 

一旦击中,发出trace命令:

 
wt -oa -oR @$ra 

并观看了呼叫NTDLL RtlSetLastWin32Error !你也可以在这里发布调查结果,看看它们会很有趣。