最近写了一个postgresql的数据库连接池dll。写的比较随意,某个头文件如下:

#pragma once

#include "common.h"
#include "PgConnParam.h"
#include <vector>

namespace pgPool
{
class PGCONNPOOL_API CPgConnStmt
{
public:
CPgConnStmt(ConnReqst* connRqst);
~CPgConnStmt();

public:

//by execute sql statement directly
bool ExeStatement(std::string sql);

//by by execute sql statement indirectly
bool Create(std::string SqlString);
bool BindParameter(CPgConnParam& param);
bool ExeStatement();

bool GetErrorMsg(std::string & msg);

bool GetNext();
bool GetFieldValue(const char* strFieldName, std::string &Val);
//bool GetBlobValue(const char* strFieldName, std::string &Val); //postgresql 结果集无法返回同时是二进制和文本的内容
bool GetFieldValue(const char* strFieldName, int &Val);
bool GetFieldValue(const char* strFieldName, double &Val);

long long GetAffectedRows();

private:
CPgConnStmt();
void Free();
private:
PGresult *m_pResultSet;
ConnReqst* m_connRqst;
int m_row;
int m_totalrow;
std::string m_sql;
std::vector<CPgConnParam> m_param;
};

}

然后编译的话一堆warning

这个warning的原因我是知道的,就是std的东西都是模板实现的,包含头文件的时候包含了模板类。对于不同的编译环境,如vs2008与vs2015,std的实现方式可能不一致,就导致使用这个dll的模块可能会有dll链接不一致的风险。

最好的规避方法是使用pImp模式,把std的细节包含在实现内,不要暴露给使用方。项目比较紧并且已经有人使用了,目前还没改成正规的方式。

只要确保vs的编译环境一致,目前还是可以用的。

然后就踩到了另外一个坑,编译没问题,调试的时候莫名其妙报了“__acrt_first_block == heade”的窗体。

出错的地方在“bool Create(std::string SqlString)的函数结束处”

问题的原因是 模块间一定要遵守“谁new谁delete的原则”,使用DLL的时候,问题可能在于不同的堆用于分配和释放 引起的。

改为bool Create(std::string& SqlString) 后解决。

切记,编译器的warning还是要重视的,以后写dll,一定不要把std的东西暴露给用户!

2017-9-5更新:

运行不久后还是报错了,原因在于string传入的时候如果长度不够,会在dll模块进行realloc,然后会造成不同模块之间new与delete。

解决办法,编译成静态库或者不要使用dll了。。

最新文章

  1. 深入理解android:id以及@+id/name和@id/name的区别联系
  2. 文本溢出省略解决笔记css
  3. 配置本地光盘为yum源
  4. ASP.NET获取客户端IP/用户名等信息
  5. C#中关键字ref修饰类对象或结构体[转]
  6. 数值的整数次方(剑指offer面试题11)
  7. OpenCV+QT开发环境(一):Windows环境
  8. homework-06-C++11
  9. C++学习之路—运算符重载(一)概念、方法及规则
  10. vm_write
  11. (0)写给Web初学者的教案-----Web基础
  12. 基于Entity Framework的自定义分页,增删改的通用实现
  13. Kafka的partions和replication-factor参数的理解
  14. 阿里云上rabbitmq安装
  15. Affiliate实战记录之一:CPI、CPA、CPM...名词解释
  16. Mysql中use一个表出现警告:Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A
  17. 自学Linux Shell8.1-linux文件系统概述及操作
  18. django 1.9.7 css控制模板样式
  19. WPF中自定义路由事件
  20. WP8.1学习系列(第十九章)——事件和路由事件概述

热门文章

  1. 手把手教你轻松实现listview上拉加载
  2. 1033. To Fill or Not to Fill (25) -贪心算法
  3. 02_Android写xml文件和读xml文件
  4. python字典作为统计记录工具
  5. MySQL错误“Specified key was too long; max key length is 1000 bytes”的解决办法
  6. 【Qt编程】Qt学习之窗口间的相互切换
  7. JNI设置C++与java的结合(2)
  8. 栈的顺序存储 - 设计与实现 - API实现
  9. git remote
  10. Linux内核通用队列的使用笔记(读linux内核设计与实现)