Chinaunix首页 | 论坛 | 博客
  • 博客访问: 500916
  • 博文数量: 60
  • 博客积分: 2673
  • 博客等级: 少校
  • 技术积分: 700
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-09 00:25
个人简介

目前主要从事C++软件开发

文章分类

全部博文(60)

文章存档

2013年(3)

2012年(3)

2010年(6)

2009年(23)

2008年(25)

我的朋友

分类: C/C++

2012-07-17 10:23:49

软件系统集成灵活运用配置文件能节省我们很多开发时间,并可以给系统维护带来极大的便利。
下面以我最近做的一个小项目为例。
我接到一个小CASE,公司想把他们的两个产品做一个整合:把一个工具性的软件集成到公司开发的一个软件系统中去。这个工具箱软件暂且命名为:Tool_A.集成到的系统暂且命名为:AutoSystem

原来的时候Tool_A的一些参数都是要用户手动去输入的,因为AutoSystem可以自动扫描出这些Tool_A所要的数据。扫描出这些数据之后,AutoSystem存放在一个Access的文件中。

Solution_A:我是想把原来系统的代码全部移植到AutoSystem中,这个方案我花了很多时间,但是失败了。原因是我对这个Tool_A根本不了解。AutoSystem我也不了解。
我要全部了解这些东西无疑要花去很多时间,在试用期的我,怎么能花这么长时间呢。
我想到现在很多软件安装后,都有很多exe文件他们都可以独立的运行。
后来我想到了Solution_B的这个方法

Solution_B:两个系统我还是让他们分别独立。我改变了Tool_A的界面,界面画一个表格
这个是数据来源于系统AutoSystem。我在AutoSystem里面菜单下面加个一个该工具的菜单选项,并且加了一个快捷图标在。这样的话,我把原来的一些从界面上获取的参数,全部用表格里面的数据代替。
这样带来的一个问题是数据文件的路径怎么获取呢?
开始我测试用的是绝对路径,用过之后,我就考虑如何获取路径的问题了。
在AutoSystem中有个路径的全局变量
后面我就想把这个全局变量,但点击Tool_A这个菜单的时候,就会把这个全局变量保存到C盘下面的一个配置文件中DB.ini
当运行Tool_A的时候,我在初始化的时候,就从DB.ini中读取数据库的路径

这样就可以让程序无论拷贝到那个地方都可以正常的运行使用了。
主要的核心代码在下面做一些分享,这些代码其实都可以在网上搜索到。这里做一下小小总结:
代码一:MFC读取数据库文件核心代码

点击(此处)折叠或打开

  1. void CAccessDBDlg::readFromDB()
  2. {
  3.     CString DB_T=_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=");
  4.     g_strDatabasefilepath=DB_T+_T("E:\\Alex\\AccessDB\\Debug\\Student.mdb");
  5.     _ConnectionPtr m_pConnection;
  6.     AfxOleInit();
  7.     m_pConnection.CreateInstance(__uuidof(Connection));
  8.     try
  9.     {

  10.         m_pConnection->Open(g_strDatabasefilepath.GetString(),"","",adModeUnknown);

  11.     }
  12.     catch(_com_error e)
  13.     {
  14.         //AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!");
  15.         
  16.     }

  17. _RecordsetPtr m_pRecordset;
  18. m_pRecordset.CreateInstance(__uuidof(Recordset));

  19. // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
  20. // 因为它有时会经常出现一些意想不到的错误。jingzhou xu
  21. try
  22. {
  23.     CString sql;
  24.     sql.Format(_T("select * from student"));
  25.  m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch *)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
  26. }
  27. catch(_com_error *e)
  28. {
  29.     AfxMessageBox(e->ErrorMessage());
  30. }

  31.  
  32. _variant_t var;
  33. CString strName,strAge;
  34. try
  35. {
  36.     if(!m_pRecordset->EndOfFile)
  37.         m_pRecordset->MoveFirst();
  38.     else
  39.     {
  40.         AfxMessageBox(_T("表内数据为空"));
  41.         return;
  42.     }
  43. int i=0;
  44.     while(!m_pRecordset->EndOfFile)
  45.     {
  46.         var = m_pRecordset->GetCollect("name");
  47.         if(var.vt != VT_NULL)
  48.             strName = (LPCSTR)_bstr_t(var);
  49.         var = m_pRecordset->GetCollect("age");
  50.         if(var.vt != VT_NULL)
  51.             strAge = (LPCSTR)_bstr_t(var);

  52.         m_list.InsertItem(i,strName);
  53.         m_list.SetItemText(i,1,strAge);

  54.         m_pRecordset->MoveNext();
  55.         ++i;
  56.     }

  57. }
  58. catch(_com_error *e)
  59. {
  60.     AfxMessageBox(e->ErrorMessage());
  61. }


  62. }
下面一个代码是从表格中获取数据的属于listctl控件的用法

点击(此处)折叠或打开

  1. int ROW=-1;
  2.     CString str;
  3.     for(int i=0; i<m_list.GetItemCount(); i++)
  4.     {
  5.         if( m_list.GetItemState(i, LVIS_SELECTED) ==LVIS_SELECTED )
  6.         {
  7.             str.Format(_T("选中了第%d行"), i);
  8.             ROW=i;
  9.         AfxMessageBox(str);
  10.         }
  11.     }
文件的写和读取

点击(此处)折叠或打开

  1. CFile delFile;
  2.     CStdioFile mFile;
  3.     CFileException mExcept;

  4. CString g_strDatabasefilepath=_T("Hello,World");


  5.     if (_access("DB.ini",0)!=-1)
  6.     {


  7.         delFile.Remove(_T("DB.ini"));

  8.         mFile.Open(_T("DB.ini"), CFile::modeWrite|CFile::modeCreate, &mExcept);
  9.         mFile.WriteString(g_strDatabasefilepath);
  10.         mFile.Close();
  11.     }
  12.     else
  13.     {
  14.         mFile.Open(_T("DB.ini"), CFile::modeWrite|CFile::modeCreate, &mExcept);
  15.         mFile.WriteString(g_strDatabasefilepath);
  16.         mFile.Close();

  17.     }
从文件中读取

点击(此处)折叠或打开

  1. CStdioFile file;

  2.     CFileException mExcept;
  3.     file.Open(_T("DB.ini"),CFile::modeRead,&mExcept);
  4.     file.ReadString(m_fileStr) ;

  5.     file.Close();

  6. UpdateData(FALSE);

阅读(1535) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~