博文

【转载】系统分析师修养(2008-07-17 19:35:00)

摘要:   系统分析作为专家、顾问、高级人才,是精英中的精英,往往决定着企业信息化建设的成败;他们既是IT企业中的技术骨干和将才,负责公司项目可行性研究与利益分析,是企业的智囊高参和运筹帷幄的帅才;同时又但负着研发人员的技术指导工作;他们是IT企业软件新产品市场前景的预测者和参与营销的市场策划者,承担着为客户设计开发软件新产品的业务指导任务和向客户提供二次开发的技术支持和培训顾问服务;因此他们往往同时代表着客户、企业、员工多方利益,堪称具有国际视野的高级复合型人才。

    系统分析师的使命决定了他们必须有从事试验、掌握世界上最新技术最新方法,具体借鉴眼光与能力,理解商务逻辑和客户需求,能熟练运用工具软件优化软件过程,有管理信息系统的设计、项目设计能力,开发进度的估计能力、控制力及相关经验,有良好的理解力和逻辑分析能力以及表达能力、较强的沟通能力,具备常规文档的写作能力等等。
    然而国家软考20年来,真正取得系统分析师资格的人仅4000人左右,即使取得资格的也往往并不能在信息化建设方面发挥应有的作用,同时企事业单位对系统分析师的不重视,更是严重阻碍着中国信息化的进一步发展,作者作为系统分析师中的一员,觉得系统分析师自我修养的提高和国家系统分析师队伍的建设迫在眉睫、刻不容缓。具体可以从以下方面来规范、强化自己的素质修养。

    1,德才兼备、德艺双馨:
    大局全局观,平等平衡观,修养高深、技艺超群,举止行为足可为人师表;具有独特的令人崇敬的信念和哲学思想,有敢于和流行观念对抗的勇气;能保持客观公正的心态公平地看待一切人和处理一切事,有容乃大、包容一切;

    2,强烈的责任心和事业心:
    实际上这对每个岗位来说都是必备素质,需要对事业、对艺术始终保持那份执着责任心和顽强毅力。系统分析师由于必须保证分析的准确性,尤其是需求,所以责任更为重大。一般来说,不应以用户表述不明确,无法得到需求,或者用户需求变化太多太快作为借口,更不能因为下面的研发技术人员技术水平不如自己而责备研发技术人员,同时也需要能够为......

阅读全文(1532) | 评论:0

【原创】VC中访问ACCESS数据库(2008-07-17 01:50:00)

摘要: VC6访问ACCESS数据库   不会用数据库,有些东西写的不好!   一、完成初始化工作 本程序完成一个简单的查询功能能,根据输入的代码,输出代码对应的信息。 首先,创建基于对话框的应用程序,导入ADO库 在stdafx.h中添加代码: #import "C:\Program Files\Common Files\System\ado\msado15.dll"no_namespace rename("EOF","rsEOF")   第二步,完成的一些初始化工作,打开本地数据库 // 初始化COM,创建ADO连接等操作          AfxOleInit();          m_pConnection.CreateInstance(__uuidof(Connection));            // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,          // 因为它有时会经常出现一些想不到的错误。          try                          {                    &nbs......

阅读全文(4595) | 评论:0

Win32串口编程(2008-07-09 12:29:00)

摘要:在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行,应用广泛。 一般情况下,工控机和各智能仪表通过RS485总线进行通信。RS485的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点。每次通信都是由PC机通过串口向智能控制单元发布命令,智能控制单元在接收到正确的命令后作出应答。   在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活。其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。本文我们只介绍API串口通信部分。   串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。 无论那种操作方式,一般都通过四个步骤来完成: (1) 打开串口 (2) 配置串口 (3) 读写串口 (4) 关闭串口 (1) 打开串口   Win32系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。该函数的原型为: HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); lpFileName:将要打开的串口逻辑名,如“COM1”; dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列; dwShareMode:指定共享属性,由于串口不......

阅读全文(2011) | 评论:0

指针详细(2008-07-08 12:45:00)

摘要: 指针专题


一、数组的指针、指针数组以及指向指针的指针   考虑数组的指针的时候我们要同时考虑类型和维数这两个属性。换一句话,就是说一个数组排除在其中存储的数值,那么可以用类型和维数来位置表示他的种类。 A)一维数组
  在c和c++中数组的指针就是数组的起始地址(也就第一个元素的地址),而且标准文档规定数组名代表数组的地址(这是地址数值层面的数组表示)。例如:int a[10];
int *p; p=&a[0]//和p=a是等价的:

  因为a是数组名,所以他是该数组的地址,同时因为第一个元素为a[0],那么&a[0]也代表了该数组的地址。但是我们是不是就说一个数组名和该数组的第一个元素的&运算是一回事呢?在一维的时候当时是的,但是在高维的时候,我们要考虑到维数给数组带来的影响。
  a[10]是一个数组,a是数组名,它是一个包含10个int类型的数组类型,不是一般的指针变量噢!(虽然标准文档规定在c++中从int[]到int*直接转换是可以的,在使用的时候似乎在函数的参数为指针的时候,我们将该数组名赋值没有任何异样),a代表数组的首地址,在数字层面和a[10]的地址一样。这样我们就可以使用指针变量以及a来操作这个数组了。
所以我们要注意以下问题: (1) p[i]和a[i]都是代表该数组的第i+1个元素;
(2) p+i和a+i代表了第i+1个元素的地址,所以我们也可以使用 *(p+I)和*(a+I)来引用对象元素;
(3)p+1不是对于指针数量上加一,而是表示从当前的位置跳过当前指针指向类型长度的空间,对于win32的int为4byte; B)多维数组
  对于二维数组a[4][6];由于数组名代表数组的起始地址,所以a(第一层)和第一个元素a[0][0]地址的数字是相同的,但是意义却是不同的。对于该数组我们可以理解为:a的一维数组(第一层),它有四个元素a[0]、a[1]、a[2]、a[3](第二层),而每个元素又含有6个元素a[0][0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5](第三层),…到此我们终于访问到了每个元素了,这个过程我们经历了:a->a[0]->......

阅读全文(1593) | 评论:0

使用MFC的数组类(2008-07-08 12:37:00)

摘要:使用MFC的数组类


  MFC的数组类支持的数组类似于C++中的常规数组,可以存放任何数据类型。C++的常规数组在使用前必须将其定义成能够容纳所有可能需要的元素,而MFC数组类创建的对象可以根据需要动态地增大或减小,数组的起始下标是0,而上限可以是固定的,也可以随着元素的增加而增加,数组在内存中的地址仍然是连续分配的。
  MFC定义了数组模板类CArray,并针对各种常用变量类型定义了CByteArray,CWordArray,CUIntArray,CDWordArray,CStringArray,CObArray,CPtrArray。详见下表: 数组类 变量类型 变量数值范围 头文件 CArray 通过模板类的参数类型设定各种类型   Afxtempl.h CByteArray 8位无符号整数 BYTE类型 0—255 Afxcoll.h CWordArray 16位无符号整数 WORD类型 0—65535 Afxcoll.h CDWordArray 32位无符号整数 DWORD类型 0—4294967295 Afxcoll.h CUIntArray 32位无符号整数 UINT类型 0—4294967295 Afxcoll.h CStringArray CString字符串 string字符串   Afxcoll.h CObArray CObject类及其派生类   Afxcoll.h CPtrArray void* 类型指针   Afxcoll.h
MFC数组类使用方法基本相同,下面分别以CArray和CUIntArray为例演示说明数组类的使用......

阅读全文(1703) | 评论:0

Application Wizard生成的项目文件简介(2008-07-07 19:19:00)

摘要:Application Wizard生成的项目文件简介



  当我们用Application Wizard生成一个新的项目时,MFC会自动为我们产生不少的程序文件,那么这些文件都是干什么用的呢?在这里,我把它们向大家介绍一下,希望对一些初学VC的朋友有些帮助,老鸟们就不用浪费时间了,呵呵!
  其实生成项目完成之后,我们会在项目目录里面发现一个readme.txt文件,项目所生成的程序文件在这里都有介绍,不过一般都是英文的。Application Wizard产生项目的同时,也展现了MFC机制为我们打下的程序框架,更为我们提供了用以扩展的程序。
  依据不同的选项,产生的文件也有所不同,以下是Application Wizard产生的标准程序文件(假设项目名称为ExMFC),大致可以分为以下几类:
  · 工作区文件、项目文件和make文件
  · 应用程序源文件和头文件
  · 资源文件
  · 预编译头文件
  · 按可选项增加的AppWizard文件
工作区、项目文件和make文件
  ExMFC.dsp — 这是MFC生成的项目文件,它包含当前项目的设置、所包含的文件等信息。
  ExMFC.dsw — 这是MFC自动生成的工作区文件,它包含当前工作区所包含的项目的信息。
  ExMFC.MAK — 这是MFC项目的项目文件,这也是与NMAKE兼容的文件。如果选择了External make文件可选项,则可人工对它编辑,但不能利用Visual C++许多项目编辑特性。
  ExMFC.clw — 这个文件含有被ClassWizard用来编辑现有类或增加新类的信息。ClassWizard还用这个文件来保存创建和编辑消息映射和对话框数据所需的信息,或是创建虚拟成员函数所需的信息。
应用程序源文件和头文件
  ExMFC.h — 这是应用程序的主头文件,它含有所有全局符号和用于包含其它头文件的#include伪指令。
  ExMFC.cpp — 这个文件是应用程序的主源文件。它将创建CExMFCApp类的一个对象(从CWinApp派生),并覆盖InitInstance成员函数。
  MainFrm.h,Main......

阅读全文(1702) | 评论:0

VC 和 MFC 的一些常见问题(2008-07-07 19:18:00)

摘要:VC 和 MFC 的一些常见问题
原 作 者:loose_went
原 出 处:VC在线




  最近整理了VC 和 MFC 的一些常见问题,希望对各位有用。

  如何抛出(throw)由CUserException派生的异常?

  当我试图捕获(catch)一个派生类异常时,我得到以下错误"error C2039:'classCMyException': is not a member of 'CMyException' 'classCMyException': undeclared identifier 'IsKindOf': cannot convert parameter 1 from 'int*' to 'const struct CRuntimeClass*"

  你必需通过使用DECLARE_DYNAMIC()和IMPLEMENT_DYNAMIC()宏来使你的CMyException类可以动态地创建。CATCH宏希望能够得到关于被抛出类的运行时刻信息。

  异常类一定要从CUserException中派生出来吗?

  不,CUserException中的"User"仅仅指用户产生的异常。而把它当作你所能派生的唯一异常是种常见的误解。

  如何从HDC建立一个CDC类?

  有时Windows API将会给你一个DC句柄,你可以通过它建立一个CDC类。例如:下拉式列表、组合框和按钮。通过hDC你将接收到绘制消息。下面是将HDC转换成你更熟悉的CDC的程序段。你也可以将该技巧用在其他任何MFC类和Windows句柄的转换中。

void MyODList::DrawItem(LPDRAWITEMSTRUCT lpDrawItem)
{
CDC myDC;
myDC.Attach(lpDrawItem->hDC);
//在此插入其他需要的代码。

//如果你不将句柄分离,它将被删除,从而导致问题。
myDC.Detach();
}


  另一个方法是调用CDC类的FromHandle方法:
C......

阅读全文(2486) | 评论:0

VC++实现Win2000下直接读写磁盘扇区(2008-07-07 19:17:00)

摘要:VC++实现Win2000下直接读写磁盘扇区
原 作 者:leecylove
原 出 处:VC在线




引言

  由于Windows 操作系统在很大程度上采取了访问安全保护机制(例如,在Windows操作系统下不能直接访问物理内存、不能使用各种DOS、BIOS中断等等),使得广大程序设计人员在长时间的开发过程中不知不觉地逐渐养成了这样的潜意识——在Windows操作系统下直接操纵硬件设备是极端困难和非常烦琐的,并将其看作Windows编程的一个禁区。尽管在大多数场合下这样的论断还算是贴切,但也并非对所有的硬件设备访问都那么困难。其实Windows在采取“实保护”措施的同时也提供了另外的一种有别于在DOS下访问硬件设备的方法,即把所有的硬件设备全部看做“文件”,并允许按照对文件的读写方式来对其进行数据存取访问。撰写本文的另外一个目的也就是帮助读者打消在Windows环境下对硬件编程的恐惧心理。

  对磁盘扇区数据的访问

  前面已经提过,在Windows 下把所有的设备当作文件进行操作。如果对串口进行编程或许不少读者还比较熟悉:对于串行端口1、2,可以用”COM1”、”COM2”作为参数调用CreateFile()函数,这里的”COM1”、”COM2”即以文件存放路径的方式指出了要操作的硬件设备。但是如果需要对磁盘的某个扇区进行读写,可能不少读者不会想到使用CreateFile()函数或是不知如何使用。其实,与对串行端口的访问类似,需要用与文件存放路径相类似的方式指出要操作的硬件设备(硬盘)。但是这里并不是用“DISK1”、“DISK2”等去标识某一块物理存在的硬盘。由于逻辑扇区是存在于逻辑分区上的,因此这里需要以某种特定的格式来指定需要访问的磁盘逻辑分区。对于逻辑分区X,其格式为”\\.\X:”。

HANDLE CreateFile( LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlags......

阅读全文(1975) | 评论:0

Windows API 程序的组织结构(2008-07-07 19:15:00)

摘要:Windows API 程序的组织结构





前言:
  现在Windows程序可以说是盛极一时了,有很多人也在从事着Windows编程。那么,Windows程序的结构到底是什么样的呢?很多初学者对此都很迷惑。今天笔者就Windows 程序的动态组织结构进行一次探讨,希望对部分初学者有所帮助!

正文:
  在介绍Windows 程序的基本构架之前我们必需先了什么是消息。
  在Windows 多任务环境下同时会有许多程序交织着进行这样复杂的工作是如何管理的呢? Windows 凭借的就是“消息传送(MessagePassing)”这个法宝!在Windows 下所有外部输入如按键、鼠标、按钮、移动计时等动作都是由系统先拦截转换成消息(Message)之后再传给各个程序,Windows 拦截输入的目的之一是为了将不同外设输入的数据转换成一致的格式以方便程序处理这个一致的格式就是消息(Message)。

消息是一个结构它的组成如下:
typedef struct tagMSG{
HWND hWnd;    所欲送达的窗口代码(handle)
UINTmessage;    消息为-Unsign 整数(int)
WPARAMwParam; 相关参数后文说明

LPARAMtParam; 相关参数后文说明
DWORDtime 时间
POINTpt 鼠标光标位置
}MSG;
  我们可以看到消息结构包含了按键鼠标时间等不同输入设备的数据,其中很重要的是第一项hWnd,这是消息所欲送到的窗口的句柄(handle)。也就是说“消息传送的最终目的地是窗口而不是程序” 这一点很重要请各位记住。

  传送消息时如果程序正在忙碌来不及接收源源而来的消息那消息将会漏失掉,所以Wi ndows 的做法是先把消息放入消息队列(Message Queue)内等有空闲时再由程序主动从队列中读取消息。每个程序运行之初Windows 就会为它创建一个存放消息的队列称为应用程序消息队列(Application message queue)。当外部输入发生时输入设备的驱动程序会将输入转换成消息的格式收集到一个系统的队列(......

阅读全文(1718) | 评论:0

Windows Socket API 使用经验(2008-07-07 19:15:00)

摘要:Windows Socket API 使用经验


 


  本文是我在进行MS-Windows、HP-Unix网络编程的实践过程中总结出来的一些经验,仅供大家参考。本文所谈到的Socket函数如果没有特别说明,都是指的Windows Socket API。

一、WSAStartup函数

int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );


  使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。该函数执行成功后返回0。
例:假如一个程序要使用2.1版本的Socket,那么程序代码如下

wVersionRequested = MAKEWORD( 2, 1 );
err = WSAStartup( wVersionRequested, &wsaData );

二、WSACleanup函数

int WSACleanup (void);


  应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。

三、socket函数

SOCKET socket( int af, int type, int protocol );


  应用程序调用socket函数来创建一个能够进行网络通信的套接字。第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置PF_INET;第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为S......

阅读全文(1444) | 评论:0