实现包含windows HANDLE对象的复制构造函数

Implementing copy constructor involving windows HANDLE objects

本文关键字:复制 构造函数 对象 HANDLE 包含 windows 实现      更新时间:2023-10-16

我是win32 API的新手,所以请原谅我。

我目前正在做一个涉及Winsock的c++项目,但是我对如何正确使用事件对象HANDLE类型的复制构造函数感到困惑。

概述(代码如下):在尝试使用IOCP和保持一切可扩展,我有一个线程,检查多个接受事件。每个ServerConnection对象都拥有自己的接受事件对象,该对象由WSACreateEvent()、其关联的低级套接字和相关的状态/变量创建。

我的问题是,我试图实现"三大",我不太确定我应该如何"复制"句柄。

DuplicateHandle()似乎创建了一个新的句柄,但它指向同一个对象,但就ServerConnection"副本"而言,这没有意义(我们想要一个具有相同状态的新对象,对吗?)。

至于使用复制赋值操作符,我不确定它会对事件对象句柄做什么。

ServerConnection.h

class ServerConnection
{
public:
    //...constructors, destructors, etc...
    virtual HANDLE getAcceptEvent();
    virtual void setAcceptEvent(HANDLE eventObj);
protected:
private:
    HANDLE assocAcceptEvent;
    //..other variables...
};

ServerConnection.cpp

ServerConnection::ServerConnection(ServerConnection &that)
{
   //blah blah...other vars
   //? This does not seem right as the HANDLE is logically a pointer;
   //Assigning like this just points another handle to the same event obj
   //If the other ServerConnection object closes the handle...not good.
   this.assocAcceptEvent = that.assocAcceptEvent;
   //The only thing that make slightly more sense, is just to create a whole new one
   //if I answered my own question, then great...but I wanted to make sure
   this.assocAcceptEvent = WSACreateEvent(); 
   //assume check for WSACreateEvent failing with WSAGetLastError() and
   //handle appropriately
}

事实上,你不能以一种明智的方式复制句柄(也就是说,DuplicateHandle不做你想做的)让我认为这个对象不应该是可复制的…

你要问自己的问题是:服务器连接的副本实际上意味着什么?你会在哪里/如何使用它?

我不知道答案,因为我不知道你的整体设计是什么意思是做一个ServerConnection -但事实上,它说ServerConnection让我认为它是"连接"到一些东西,因此不能轻易复制。