文档说明可以多次调用InternetOpen而不会出现任何问题。我的问题是,我应该多次调用InternetCloseHandle返回的句柄吗?
是的,如中所述
InternetOpen()
文档:
调用应用程序完成使用
HINTERNET
句柄由返回
InternetOpen
,
必须使用
InternetCloseHandle
作用
.
例如,我有一个我调用的类
CAPIRequestContext
,它有一个句柄,由返回
Internet打开
.我的每个请求都有自己的副本。现在,我打电话给
Internet关闭句柄
在析构函数中,因此它被多次调用。
如果类的每个实例都调用
Internet打开()
,或以其他方式获得唯一
HINTERNET公司
.
然而
,请注意这样的类需要实现
Rule of Three
基本上,如果必须提供析构函数来释放资源,还需要提供复制构造函数和复制赋值运算符。
但是,你不能打电话
InternetCloseHandle()
在同一时间多次
HINTERNET公司
,所以不能有多个
CAPI请求上下文
使用相同的
HINTERNET公司
他们都在打电话
Internet关闭句柄()
1.
。因此,复制构造函数和复制赋值运算符必须:
-
取得所有权
HINTERNET公司
从源头
CAPI请求上下文
正在被复制。
-
完全禁用以防止复制
CAPI请求上下文
到另一个。
在你的情况下,我会选择#2。
1.
:您需要一个每个实例的标志,指示哪些实例可以调用它,哪些实例不能调用它。但这不是一个好的课堂设计。如果您需要共享
HINTERNET公司
,您应该实现引用计数语义,例如
std::shared_ptr
.
我想知道以下是否会导致问题:线程A创建了一个调用InternetOpen并存储句柄的CAPIRequestObject。线程B也这样做,但在线程A退出之前就超出了范围,因此线程B在自己的CAPIRequestObject中调用析构函数,后者在InternetOpen返回的句柄上调用InternetCloseHandle。
这是非常安全的,只要每个
CAPIRequestObject
有自己的
HINTERNET公司
.
我应该在类的析构函数中删除对InternetCloseHandle的调用吗?
否,如果每个类实例都具有唯一的
HINTERNET公司
.
我假设应该为HttpOpenRequest返回的句柄调用InternetCloseHandle。
是的,正如
HttpOpenRequest()
文档:
调用应用程序完成使用
HINTERNET公司
句柄由返回
HttpOpenRequest
,
必须使用
Internet关闭句柄
作用
.
关于InternetConnect返回的句柄,我有类似的问题。这些句柄是共享的吗?
每个
HINTERNET公司
必须单独关闭。