关于OpenSSL的一些问题的补充
程序员文章站
2024-03-14 18:14:22
...
【1】warning C4150: 删除指向不完整“ssl_ctx_st”类型的指针;没有调用析构函数
SSL_CTX *ctx;
SSL *ssl;
delete ssl;
delete ctx;
ctx 和 ssl 是不能直接用delete释放内存的,析构函数对调用的类是不可见的,必须以如下方式释放内存:
SSL_shutdown(ssl);
SSL_free(ssl);
SSL_CTX_free(ctx);
【2】warning C4251: “CSSLPort::m_clsSSLVec”: class“std::vector<_Ty>”需要有 dll 接口由 class "CSSLPort"的客户端使用
std::vector<CSSLPortMeta *> *m_pclsSSLVec;
其中class CSSLPortMeta 定义如下:
.h
class COMMUNICATION_API CSSLPortMeta
{
public:
SOCKET m_hSocket;
SSL *m_pSSL;
public:
CSSLPortMeta(void);
virtual ~CSSLPortMeta(void);
void SetData(SOCKET socket, SSL *ssl);
};
.cpp
CSSLPortMeta::CSSLPortMeta(void)
{
m_pSSL = NULL;
}
CSSLPortMeta:: ~CSSLPortMeta(void)
{
if(m_pSSL!=NULL)
{
SSL_shutdown(m_pSSL);
SSL_free(m_pSSL);
}
}
void CSSLPortMeta::SetData(SOCKET socket, SSL *ssl)
{
m_hSocket = socket;
m_pSSL = ssl;
}
1、第一种: 无视它或者#pragma warnind( disable: 4251 );(不推荐)
2、第二种:改成指针类型
std::vector<CSSLPortMeta *> *m_pclsSSLVec;
初始化:
m_pclsSSLVec = new std::vector<CSSLPortMeta *>;
释放内存:
size_t nCount = m_pclsSSLVec->size();
for(size_t i=0; i<nCount; i++)
{
CSSLPortMeta *pData = (*m_pclsSSLVec)[i];
if(pData!=NULL)
delete pData;
}
m_pclsSSLVec->clear();
delete m_pclsSSLVec;
还有其他方式,这里就不介绍了,没试过。
【3】自己写的dll想要引入OpenSSL,程序运行时出现报错:无法识别#include <OpenSSL/ssl.h>
新建一个Win32应用程序OpenSSL,应用程序类型选择DLL,点击完成。将所有需要的OpenSSL相关头文件导入,然后给自己写的dll添加项目依赖项OpenSSL, 代码的前面添加#pragma comment(lib, "OpenSSL.lib"),然后如我的第一篇文章所写的那样导入相关lib文件和dll文件即可。