zlib冲突事件小记

1 事件起因

出于安全考虑,Web服务器需要启用SSL,需要使用HTTPS方式访问,Web服务器端又使用了SNI技术,然而Windows XP不支持SNI技术,导致Windows XP系统下使用WinINet API实现的HTTPS接口访问不了Web服务器。

查阅相关资料后确定使用libcurl+openssl实现HTTP请求接口替换掉WinINet API实现的接口。选择以纯静态库方式调用,编译了支持openssl、zlib的libcurl静态库。

写了个使用curl easy接口获取下载文件大小的函数,在主程序中进行测试的时候,发现和CxImage库中使用的zlib发生了冲突。

搜索了下发现可以通过FORCE:MULTIPLE让编译器忽略这种冲突,但是微软官方给出了提示,这样处理可能会导致不可预期的问题,所以不能使用这种方式解决冲突。
阅读剩余部分 –

如何集成第三方库

1 库的层次结构

在使用第三方库时,通常是不会对源码进行频繁修改,这种情况下只需要编译生成一次库文件,把库文件集成到项目中。有一些第三方库在使用时可能会频繁的修改库的源码,这种情况下就需要直接把库的代码集成到项目中。

下面分别以名为ThirdSourceLib、ThirdDllLib、ThirdStaticLib的库为示例。

阅读剩余部分 –

线程间数据传递-多线程处理队列CXMulThreadQueue(IOCP实现)

在文章《线程间数据传递–多对多队列CXMulToMulQueue》中给出了一种多对多队列CXMulToMulQueue的实现,所有入队和出队使用同一个锁,当数据传递频繁时多个线程访问队列必然会导致锁竞争。

完成端口函数PostQueuedCompletionStatus(HANDLE, DWORD, ULONG_PTR, LPOVERLAPPED)传递的后三个参数会被函数GetQueuedCompletionStatus(HANDLE, LPDWORD, PULONG_PTR, LPOVERLAPPED, DWORD)原封不动的接收到,完成端口不会对这三个参数做任何操作,其中特别指出LPOVERLAPPED可以不是指向OVERLAPPED结构的指针。利用这个特性,把需要传递的数据地址直接投递到完成端口,由完成端口内部做访问互斥处理,可以有效减少由于锁竞争导致的耗时。
阅读剩余部分 –

分类目录

文章归档