C++使用OLE高速读写EXCEL的源码

写了不少blog,也码了一点点文字,不知道为啥,被大家看的比较多几篇文章却总有那篇《C++读写EXCEL文件方式比较》。

小小伤心一下,我blog里面写的很认真的文字还有几篇,这篇大概是最随意的文章。个人估计这是SEO的作用导致的。

另外,由于文中提到了可以加快OLE读取的EXCEL的速度,总有一些哥们找我要代码。

好吧,好吧,把代码放出来,因为我原来也是找人家的代码逐步改的。来而不往非礼也。

 

我的代码参考的地方是这儿,再次感谢原作者

http://blog.csdn.net/gyssoft/archive/2007/04/29/1592104.aspx

我根据自己的需要做了整理,干净了一点,而后根据发现的速度问题做了一些优化。

 

预加载的思路来自这个帖子

http://topic.csdn.net/t/20030626/21/1962211.html

其实思路很简单,不再一个CELL一个CELL的伛数据,而是一次把表格里面所有的数据读取出来处理。

 

.h文件的源码代码如下:

其中的头文件都是OLE的头文件。如何导出可以参考

http://blog.csdn.net/wyz365889/article/details/7599924

我自己这儿一直保存了一套别人生成的这几个文件,也可以用。大家可以找找有没有下载的,不过我不太确认跨版本是否可行。

还有既然是OLE,你一定要安装EXCEL的。


#pragma once

//OLE的头文件
#include <CRange.h>
#include <CWorkbook.h>
#include <CWorkbooks.h>
#include <CWorksheet.h>
#include <CWorksheets.h>
#include <CApplication.h>

///
///用于OLE的方式的EXCEL读写,
class IllusionExcelFile
{

public:

    //构造函数和析构函数
    IllusionExcelFile();
    virtual ~IllusionExcelFile();

protected:
    ///打开的EXCEL文件名称
    CString       open_excel_file_;

    ///EXCEL BOOK集合,(多个文件时)
    CWorkbooks    excel_books_; 
    ///当前使用的BOOK,当前处理的文件
    CWorkbook     excel_work_book_; 
    ///EXCEL的sheets集合
    CWorksheets   excel_sheets_; 
    ///当前使用sheet
    CWorksheet    excel_work_sheet_; 
    ///当前的操作区域
    CRange        excel_current_range_; 


    ///是否已经预加载了某个sheet的数据
    BOOL          already_preload_;
    ///Create the SAFEARRAY from the VARIANT ret.
    COleSafeArray ole_safe_array_;

protected:

    ///EXCEL的进程实例
    static CApplication excel_application_;
public:
    
    ///
    void ShowInExcel(BOOL bShow);

    ///检查一个CELL是否是字符串
    BOOL    IsCellString(long iRow, long iColumn);
    ///检查一个CELL是否是数值
    BOOL    IsCellInt(long iRow, long iColumn);

    ///得到一个CELL的String
    CString GetCellString(long iRow, long iColumn);
    ///得到整数
    int     GetCellInt(long iRow, long iColumn);
    ///得到double的数据
    double  GetCellDouble(long iRow, long iColumn);

    ///取得行的总数
    int GetRowCount();
    ///取得列的总数
    int GetColumnCount();

    ///使用某个shet,shit,shit
    BOOL LoadSheet(long table_index,BOOL pre_load = FALSE);
    ///通过名称使用某个sheet,
    BOOL LoadSheet(const char* sheet,BOOL pre_load = FALSE);
    ///通过序号取得某个Sheet的名称
    CString GetSheetName(long table_index);

    ///得到Sheet的总数
    int GetSheetCount();

    ///打开文件
    BOOL OpenExcelFile(const char * file_name);
    ///关闭打开的Excel 文件,有时候打开EXCEL文件就要
    void CloseExcelFile(BOOL if_save = FALSE);
    //另存为一个EXCEL文件
    void SaveasXSLFile(const CString &xls_file);
    ///取得打开文件的名称
    CString GetOpenFileName();
    ///取得打开sheet的名称
    CString GetLoadSheetName();
    
    ///写入一个CELL一个int
    void SetCellInt(long irow, long icolumn,int new_int);
    ///写入一个CELL一个string
    void SetCellString(long irow, long icolumn,CString new_string);
    
public:
    ///初始化EXCEL OLE
    static BOOL InitExcel();
    ///释放EXCEL的 OLE
    static void ReleaseExcel();
    ///取得列的名称,比如27->AA
    static char *GetColumnName(long iColumn);
    
protected:

    //预先加载
    void PreLoadSheet();
};




CPP文件的与代码如下:

/******************************************************************************************
Copyright           : 2000-2004, Appache  2.0
FileName            : illusion_excel_file.cpp
Author              : Sail
Version             : 
Date Of Creation    : 2009年4月3日
Description         : 

Others              : 
Function List       : 
    1.  ......
        Modification History:
    1.Date  :
Author  :
Modification  :

    这个类是从网上下载的,我坐享其成,感谢原来的作者,我只试试是稍稍做了一下修正。
    修正包括一些参数的使用不谨慎,bool 改为BOOL等,对于对象关系,我改了一部分,感觉原来的作者对于OO的思路部分不是很清楚。
    对于这类东西OLE,我完全不了解,用别人封装的东西感觉还是放心了很多,C++,伟大的C++
     http://blog.csdn.net/gyssoft/archive/2007/04/29/1592104.aspx

    OLE读写EXCEL都比较慢,所以应该尽量减少OLE的次数
    对于读取,还有解决方法,请试用一下预加载的方式,这个方法一次加载所有的读取数据,如此速度就飞快了。
    据说写数据是没有什么方法加快的
    http://topic.csdn.net/t/20030626/21/1962211.html

    增加了一些写入方式的代码,保证可以写入EXCEL数据区,但是对于保存,我发现如果调用CLOSE并且保存的方式,
    速度非常慢,我不理解为什么。
    所以我吧EXCEL打开了,让你进行后续管理,


******************************************************************************************/




//-----------------------excelfile.cpp----------------

#include "StdAfx.h"
#include "illusion_excel_file.h"



COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);    

//
CApplication IllusionExcelFile::excel_application_;


IllusionExcelFile::IllusionExcelFile():
    already_preload_(FALSE)
{
}

IllusionExcelFile::~IllusionExcelFile()
{
    //
    CloseExcelFile();
}


//初始化EXCEL文件,
BOOL IllusionExcelFile::InitExcel()
{

    //创建Excel 2000服务器(启动Excel) 
    if (!excel_application_.CreateDispatch("Excel.Application",NULL)) 
    { 
        AfxMessageBox("创建Excel服务失败,你可能没有安装EXCEL,请检查!"); 
        return FALSE;
    }

    excel_application_.put_DisplayAlerts(FALSE); 
    return TRUE;
}

//
void IllusionExcelFile::ReleaseExcel()
{
    excel_application_.Quit();
    excel_application_.ReleaseDispatch();
    excel_application_=NULL;
}

//打开excel文件
BOOL IllusionExcelFile::OpenExcelFile(const char *file_name)
{
    //先关闭
    CloseExcelFile();
    
    //利用模板文件建立新文档 
    excel_books_.AttachDispatch(excel_application_.get_Workbooks(),true); 

    LPDISPATCH lpDis = NULL;
    lpDis = excel_books_.Add(COleVariant(file_name)); 
    if (lpDis)
    {
        excel_work_book_.AttachDispatch(lpDis); 
        //得到Worksheets 
        excel_sheets_.AttachDispatch(excel_work_book_.get_Worksheets(),true); 
        
        //记录打开的文件名称
        open_excel_file_ = file_name;

        return TRUE;
    }
    
    return FALSE;
}

//关闭打开的Excel 文件,默认情况不保存文件
void IllusionExcelFile::CloseExcelFile(BOOL if_save)
{
    //如果已经打开,关闭文件
    if (open_excel_file_.IsEmpty() == FALSE)
    {
        //如果保存,交给用户控制,让用户自己存,如果自己SAVE,会出现莫名的等待
        if (if_save)
        {
            ShowInExcel(TRUE);
        }
        else
        {
            //
            excel_work_book_.Close(COleVariant(short(FALSE)),COleVariant(open_excel_file_),covOptional);
            excel_books_.Close();
        }

        //打开文件的名称清空
        open_excel_file_.Empty();
    }

    

    excel_sheets_.ReleaseDispatch();
    excel_work_sheet_.ReleaseDispatch();
    excel_current_range_.ReleaseDispatch();
    excel_work_book_.ReleaseDispatch();
    excel_books_.ReleaseDispatch();
}

void IllusionExcelFile::SaveasXSLFile(const CString &xls_file)
{
    excel_work_book_.SaveAs(COleVariant(xls_file),
        covOptional,
        covOptional,
        covOptional,
        covOptional,
        covOptional,
        0,
        covOptional,
        covOptional,
        covOptional,
        covOptional,
        covOptional);
    return;
}


int IllusionExcelFile::GetSheetCount()
{
    return excel_sheets_.get_Count();
}


CString IllusionExcelFile::GetSheetName(long table_index)
{
    CWorksheet sheet;
    sheet.AttachDispatch(excel_sheets_.get_Item(COleVariant((long)table_index)),true);
    CString name = sheet.get_Name();
    sheet.ReleaseDispatch();
    return name;
}

//按照序号加载Sheet表格,可以提前加载所有的表格内部数据
BOOL IllusionExcelFile::LoadSheet(long table_index,BOOL pre_load)
{
    LPDISPATCH lpDis = NULL;
    excel_current_range_.ReleaseDispatch();
    excel_work_sheet_.ReleaseDispatch();
    lpDis = excel_sheets_.get_Item(COleVariant((long)table_index));
    if (lpDis)
    {
        excel_work_sheet_.AttachDispatch(lpDis,true);
        excel_current_range_.AttachDispatch(excel_work_sheet_.get_Cells(), true);
    }
    else
    {
        return FALSE;
    }
    
    already_preload_ = FALSE;
    //如果进行预先加载
    if (pre_load)
    {
        PreLoadSheet();
        already_preload_ = TRUE;
    }

    return TRUE;
}

//按照名称加载Sheet表格,可以提前加载所有的表格内部数据
BOOL IllusionExcelFile::LoadSheet(const char* sheet,BOOL pre_load)
{
    LPDISPATCH lpDis = NULL;
    excel_current_range_.ReleaseDispatch();
    excel_work_sheet_.ReleaseDispatch();
    lpDis = excel_sheets_.get_Item(COleVariant(sheet));
    if (lpDis)
    {
        excel_work_sheet_.AttachDispatch(lpDis,true);
        excel_current_range_.AttachDispatch(excel_work_sheet_.get_Cells(), true);
        
    }
    else
    {
        return FALSE;
    }
    //
    already_preload_ = FALSE;
    //如果进行预先加载
    if (pre_load)
    {
        already_preload_ = TRUE;
        PreLoadSheet();
    }

    return TRUE;
}

//得到列的总数
int IllusionExcelFile::GetColumnCount()
{
    CRange range;
    CRange usedRange;
    usedRange.AttachDispatch(excel_work_sheet_.get_UsedRange(), true);
    range.AttachDispatch(usedRange.get_Columns(), true);
    int count = range.get_Count();
    usedRange.ReleaseDispatch();
    range.ReleaseDispatch();
    return count;
}

//得到行的总数
int IllusionExcelFile::GetRowCount()
{
    CRange range;
    CRange usedRange;
    usedRange.AttachDispatch(excel_work_sheet_.get_UsedRange(), true);
    range.AttachDispatch(usedRange.get_Rows(), true);
    int count = range.get_Count();
    usedRange.ReleaseDispatch();
    range.ReleaseDispatch();
    return count;
}

//检查一个CELL是否是字符串
BOOL IllusionExcelFile::IsCellString(long irow, long icolumn)
{
    CRange range;
    range.AttachDispatch(excel_current_range_.get_Item (COleVariant((long)irow),COleVariant((long)icolumn)).pdispVal, true);
    COleVariant vResult =range.get_Value2();
    //VT_BSTR标示字符串
    if(vResult.vt == VT_BSTR)       
    {
        return TRUE;
    }
    return FALSE;
}

//检查一个CELL是否是数值
BOOL IllusionExcelFile::IsCellInt(long irow, long icolumn)
{
    CRange range;
    range.AttachDispatch(excel_current_range_.get_Item (COleVariant((long)irow),COleVariant((long)icolumn)).pdispVal, true);
    COleVariant vResult =range.get_Value2();
    //好像一般都是VT_R8
    if(vResult.vt == VT_INT || vResult.vt == VT_R8)       
    {
        return TRUE;
    }
    return FALSE;
}

//
CString IllusionExcelFile::GetCellString(long irow, long icolumn)
{
   
    COleVariant vResult ;
    CString str;
    //字符串
    if (already_preload_ == FALSE)
    {
        CRange range;
        range.AttachDispatch(excel_current_range_.get_Item (COleVariant((long)irow),COleVariant((long)icolumn)).pdispVal, true);
        vResult =range.get_Value2();
        range.ReleaseDispatch();
    }
    //如果数据依据预先加载了
    else
    {
        long read_address[2];
        VARIANT val;
        read_address[0] = irow;
        read_address[1] = icolumn;
        ole_safe_array_.GetElement(read_address, &val);
        vResult = val;
    }

    if(vResult.vt == VT_BSTR)
    {
        str=vResult.bstrVal;
    }
    //整数
    else if (vResult.vt==VT_INT)
    {
        str.Format("%d",vResult.pintVal);
    }
    //8字节的数字 
    else if (vResult.vt==VT_R8)     
    {
        str.Format("%0.0f",vResult.dblVal);
    }
    //时间格式
    else if(vResult.vt==VT_DATE)    
    {
        SYSTEMTIME st;
        VariantTimeToSystemTime(vResult.date, &st);
        CTime tm(st); 
        str=tm.Format("%Y-%m-%d");

    }
    //单元格空的
    else if(vResult.vt==VT_EMPTY)   
    {
        str="";
    }  

    return str;
}

double IllusionExcelFile::GetCellDouble(long irow, long icolumn)
{
    double rtn_value = 0;
    COleVariant vresult;
    //字符串
    if (already_preload_ == FALSE)
    {
        CRange range;
        range.AttachDispatch(excel_current_range_.get_Item (COleVariant((long)irow),COleVariant((long)icolumn)).pdispVal, true);
        vresult =range.get_Value2();
        range.ReleaseDispatch();
    }
    //如果数据依据预先加载了
    else
    {
        long read_address[2];
        VARIANT val;
        read_address[0] = irow;
        read_address[1] = icolumn;
        ole_safe_array_.GetElement(read_address, &val);
        vresult = val;
    }
    
    if (vresult.vt==VT_R8)     
    {
        rtn_value = vresult.dblVal;
    }
    
    return rtn_value;
}

//VT_R8
int IllusionExcelFile::GetCellInt(long irow, long icolumn)
{
    int num;
    COleVariant vresult;

    if (already_preload_ == FALSE)
    {
        CRange range;
        range.AttachDispatch(excel_current_range_.get_Item (COleVariant((long)irow),COleVariant((long)icolumn)).pdispVal, true);
        vresult = range.get_Value2();
        range.ReleaseDispatch();
    }
    else
    {
        long read_address[2];
        VARIANT val;
        read_address[0] = irow;
        read_address[1] = icolumn;
        ole_safe_array_.GetElement(read_address, &val);
        vresult = val;
    }
    //
    num = static_cast<int>(vresult.dblVal);

    return num;
}

void IllusionExcelFile::SetCellString(long irow, long icolumn,CString new_string)
{
    COleVariant new_value(new_string);
    CRange start_range = excel_work_sheet_.get_Range(COleVariant("A1"),covOptional);
    CRange write_range = start_range.get_Offset(COleVariant((long)irow -1),COleVariant((long)icolumn -1) );
    write_range.put_Value2(new_value);
    start_range.ReleaseDispatch();
    write_range.ReleaseDispatch();

}

void IllusionExcelFile::SetCellInt(long irow, long icolumn,int new_int)
{
    COleVariant new_value((long)new_int);
    
    CRange start_range = excel_work_sheet_.get_Range(COleVariant("A1"),covOptional);
    CRange write_range = start_range.get_Offset(COleVariant((long)irow -1),COleVariant((long)icolumn -1) );
    write_range.put_Value2(new_value);
    start_range.ReleaseDispatch();
    write_range.ReleaseDispatch();
}


//
void IllusionExcelFile::ShowInExcel(BOOL bShow)
{
    excel_application_.put_Visible(bShow);
    excel_application_.put_UserControl(bShow);
}

//返回打开的EXCEL文件名称
CString IllusionExcelFile::GetOpenFileName()
{
    return open_excel_file_;
}

//取得打开sheet的名称
CString IllusionExcelFile::GetLoadSheetName()
{
    return excel_work_sheet_.get_Name();
}

//取得列的名称,比如27->AA
char *IllusionExcelFile::GetColumnName(long icolumn)
{   
    static char column_name[64];
    size_t str_len = 0;
    
    while(icolumn > 0)
    {
        int num_data = icolumn % 26;
        icolumn /= 26;
        if (num_data == 0)
        {
            num_data = 26;
            icolumn--;
        }
        column_name[str_len] = (char)((num_data-1) + 'A' );
        str_len ++;
    }
    column_name[str_len] = '\0';
    //反转
    _strrev(column_name);

    return column_name;
}

//预先加载
void IllusionExcelFile::PreLoadSheet()
{

    CRange used_range;

    used_range = excel_work_sheet_.get_UsedRange();	


    VARIANT ret_ary = used_range.get_Value2();
    if (!(ret_ary.vt & VT_ARRAY))
    {
        return;
    }
    //
    ole_safe_array_.Clear();
    ole_safe_array_.Attach(ret_ary); 
}

【本文作者是雁渡寒潭,本着自由的精神,你可以在无盈利的情况完整转载此文档,转载时请附上BLOG链接:http://www.cnblogs.com/fullsail/ 或者http://blog.csdn.net/fullsail,否则每字一元,每图一百不讲价。对Baidu文库。360doc加价一倍】




  • 38
    点赞
  • 239
    收藏
    觉得还不错? 一键收藏
  • 36
    评论
《VC++.NET精彩百例》配套代码<br/><br/> [涉及平台] VC++.NET<br/> [作者] void<br/> [文件大小] 2969KB <br/> [更新日期] 2005-10-30<br/><br/>一、资源说明<br/><br/>第1章 界面编程<br/>实例1 "欢迎"界面 <br/>实例2 动态字幕效果 <br/>实例3 透明窗体 <br/>实例4 静态切分窗口 <br/>实例5 滚动视图 <br/>实例6 字形窗口 <br/>实例7 多边形窗口<br/>实例8 HTML浏览器 <br/>实例9 窗口的动画效果 <br/>实例10 实现动画图标 <br/>实例11 动态切分窗口 <br/>实例12 橡皮区矩形 <br/>实例13 多个定时器 <br/>实例14 椭圆窗体 <br/><br/> <br/>第2章 图像和多媒体编程<br/><br/>实例 15 BMP文件浏览器 <br/>实例 16 图像的镜像处理 <br/>实例 17 图像的分割处理 <br/>实例 18 使用画笔 <br/>实例 19 使用画刷<br/>实例 20 显示空心字 <br/>实例 21 显示渐进字体 <br/>实例 22 显示艺术字体 <br/>实例 23 马赛克效果 <br/>实例 24 MiDi播放器 <br/>实例 25 CD播放器 <br/>实例 26 纹理场景效果 <br/>实例 27 Bezier线框曲面<br/>实例 28 输出旋转文本<br/> <br/>第3章 对话框与控件编程<br/>实例 29 树形控件 <br/>实例 30 列表控件<br/>实例 31 时间控件 <br/>实例 32 彩色按钮 <br/>实例 33 组合框控件 <br/>实例 34 单选按钮和复选框 <br/>实例 35 工具栏编程 <br/>实例 36 状态栏编程 <br/>实例 37 对话框显示图片 <br/>实例 38 模式对话框 <br/>实例 39 非模式对话框 <br/>实例 40 位图按钮 <br/>实例 41 对话栏编程 <br/><br/>第4章 文件与系统编程 <br/>实例 42 鼠标绘图 <br/>实例 43 键盘输入<br/>实例 44 获取文件属性 <br/>实例 45 访问修改注册表 <br/>实例 46 设定计算机名称<br/>实例 47 列举驱动器<br/>实例 48 关闭操作系统<br/>实例 49 查找文件 <br/>实例 50 获取磁盘空间 <br/>实例 51 读写文件 <br/>实例 52 系统进程检测 <br/>实例 53 获取系统信息 <br/>实例 54 获取文件夹路径<br/>实例 55 设定系统时间<br/><br/>第5章 线程操作与COM组件编程<br/>实例 56 创建线程<br/>实例 57 线程间的通信<br/>实例 58 使用自定义消息 <br/>实例 59 线程间的优先级 <br/>实例 60 线程间的同步<br/>实例 61 重用C++对象<br/>实例 62 创建永久对象<br/>实例 63 MFC建立COM<br/>实例 64 测试COM组件 <br/><br/><br/>第6章 网络和数据库编程<br/>实例 65 聊天室服务器 <br/>实例 66 HTTP应用程序<br/>实例 67 FTP应用程序 <br/>实例 68 HTTP服务器 <br/>实例 69 发送电子邮件<br/>实例 70 接收电子邮件<br/>实例 71 ATL Server Web<br/>实例 72 DOA获取信息 <br/>实例 73 DAO数据库编程 <br/>实例 74 ADO访问数据库 <br/> <br/>第7章 OPENGL编程<br/>实例 75 绘制对比矩形 <br/>实例 76 绘制直线<br/>实例 77 绘制圆和椭圆 <br/>实例 78 绘制三角形 <br/>实例 79 缩放变换<br/>实例 80 旋转变换<br/>实例 81 平移变换<br/>实例 82 绘制点 <br/>实例 83 OpenGL编程 <br/>实例 84 实现简单动画<br/>实例 85 视口投影变换 <br/>实例 86 键盘控制图形<br/><br/>第8章 OLE和GDI+编程 <br/>实例 87 OLE容器 <br/>实例 88 保存OLE信息<br/>实例 89 设置跟踪矩形 <br/>实例 90 显示多个OLE项 <br/>实例 91 ActiveX服务器<br/>实例 92 插值模式<br/>实例 93 图像区域平铺<br/>实例 94 文字填充 <br/>实例 95 图形容器 <br/>实例 96 线帽组合 <br/>实例 97 半透明线条 <br/>实例 98 颜色再变换表 <br/>实例 99 旋转和扭曲图像<br/>实例 100 显示垂直文本<br/><br/>二、使用说明<br/> 本书所附光盘的内容包含了开发实例的所有程序源码,所有程序源码都是在Visual C++.NET上编译通过的。要运行本光盘上的实例,用户需要先安装Visual C++.NET编译环境,请将光盘上的实例拷贝到本机硬盘上,并去掉其只读属性。程序拷贝到本机硬盘后,经编译即可直接运行。(注意:各文件的文件名请与原书中的名称保持一致)<br/><br/>  关于读者近期反映的《Visual C++.net精彩编程百例》附带源码光盘问题,经核查,我们发现光盘中的确存在着源代码命名与原书不匹配的现象。发生这种现象的原因主要是由于工作人员失误,光盘在刻制过程采用了较旧的8×3文件名格式,导致某些文件/文件夹的名称信息丢失,使读者不能够直接使用。我们已经以最快的速度对此问题进行了初步更正。对于此次发布的新版源代码,您可以根据原书章节直接找到对应的源代码目录,然后根据原书中的文件名,将源代码中相应的文件名予以纠正即可正常使用。<br/><br/>  给读者的阅读使用造成了诸多不便,在此表示深深的歉意!希望能得到您的体谅并一如既往支持我们的工作,谢谢!
目录 前言 第1章 Windows CE及开发环境概述 1.1 Windows CE概述 1.1.1 Windows CE嵌入式系统概述 1.1.2 Windows CE版本 1.1.3 Windows CE 6.0概述 1.1.4 嵌入式开发流程 1.2 开发环境概述 1.2.1 Visual Studio 2005的Visual C++——Windows CE开发环境概述 1.2.2 示例程序HelloWorld 1.3 Windows CE附带远程工具概述 第2章 图形编程 2.1 设备环境类 2.2 图形对象类(GDI) 2.3 绘制各种图形 2.4 绘制位图 2.4.1 CDC绘图函数描述 2.4.2 动画效果 2.4.3 抓屏 2.4.4 图形显示特技 2.5 显示压缩格式图片 2.5.1 SHLoadImageFile方法 2.5.2 Imaging技术 2.6 简单二维曲线示例 2.6.1 二维曲线类C2Dgraph的创建 2.6.2 使用二维曲线类C2DGraph绘制曲线 第3章 对话框控件 3.1 常用控件 3.1.1 微调按钮 3.1.2 滑动条 3.1.3 进度条 3.1.4 列表视图控件 3.1.5 树控件 3.2 创建图形显示控件 3.3 创建LED数字显示控件 第4章 进程 4.1 进程 4.1.1 进程概述 4.1.2 进程创建 4.1.3 进程终止 4.1.4 其他进程函数 4.1.5 “进程列举并管理”实例 4.2 进程间通讯 第5章 线程 5.1 线程 5.1.1 线程概述 5.1.2 线程优先级 5.1.3 线程API函数 5.2 线程同步 5.2.1 未使用线程同步 5.2.2 利用事件同步 5.2.3 利用互斥同步 5.2.4 利用临界区同步 5.2.5 利用信号量同步 第6章 文件 6.1 文件基本操作 6.2 文件综合操作示例 6.3 内存映射文件 6.3.1 内存映射文件概述 6.3.2 利用内存映射文件实现进程间通讯 6.4 文件系统管理 6.5 注册表编程 6.5.1 注册表简介 6.5.2 注册表API函数 6.5.3 注册表操作举例 第7章 多媒体编程 7.1 Direct Show介绍 7.1.1 DirectShow技术框架 7.1.2 过滤器(Filter) 7.1.3 Filter Graph Manager 7.1.4 Pin 7.1.5 DirectShow 接口定义介绍 7.2 媒体播放器示例 7.3 摄像头捕捉示例 7.3.1 摄像头捕捉概述 7.3.2 摄像头捕捉示例 第8章 Windows CE基础数据库编程 8.1 EDB概述 8.1.1 装配数据卷 8.1.2 卸载数据库卷 8.1.3 创建数据库 8.1.4 创建会话对象 8.1.5 打开数据库 8.1.6 事务操作 8.1.7 删除数据库 8.1.8 枚举数据库卷以及数据库 8.1.9 查找或移动记录 8.1.10 写记录 8.1.11 读取记录 8.1.12 删除记录 8.1.13 流操作 8.2 数据库操作综合示例 第9章 SQLCE数据库编程 9.1 SQL Server FOR CE的介绍 9.1.1 SQLCE简介 9.1.2 SQL Server CE 3.0的安装 9.1.3 SQLCE 3.0连接配置 9.2 OLEDB 编程访问SQLCE 3.0 9.2.1 OLE DB 概述 9.2.2 OLEDB 编程 9.3 SQLCE远程数据访问 9.3.1 Pull(拉数据) 9.3.2 Push(推数据) 9.3.3 Submit(远程T-SQL操作) 9.4 远程数据访问综合示例 第10章 串口编程 10.1 串口概述 10.2 串口编程API函数介绍 10.3 CE串口综合示例 10.4 GPS编程示例 第11章 网络编程概述 11.1 套接字编程基础 11.1.1 WinSock初始化和释放 11.1.2 创建套接字 11.1.3 关闭套接字 11.1.4 绑定套接字 11.1.5 监听套接字 11.1.6 等待连接 11.1.7 建立连接 11.1.8 发送数据 11.1.9 接收数据 11.1.10 设置套接字模式 11.1.11 Select I/O模型 11.2 PING编程 11.2.1 PING编程概述 11.2.2 PING编程示例 11.3 RAS拨号编程 11.3.1 建立拨号连接 11.3.2 关闭拨号连接 11.3.3 列举已建立的活动连接 11.3.4 列举电话簿条目 第12章 UDP编程 12.1 UDP编程概述 12.2 UDP编程示例 第13章 TCP编程 13.1 TCP编程概述 13.2 TCP客户端示例 13.3 TCP服务器端示例 第14章 DLL编程 14.1 DLL概述 14.2 DLL的调用 14.2.1 静态调用 14.2.2 动态调用 14.3 DLL的创建 14.3.1 Windows CE DLL的创建 14.3.2 基于MFC的Regular DLL的创建 14.3.3 资源DLL 第15章 COM编程 15.1 COM基本知识概述 15.1.1 什么是COM 15.1.2 什么是接口 15.1.3 COM基本结构 15.2 使用ATL创建COM示例 15.2.1 ATL对COM支持概述 15.2.2 ATL创建COM对象示例 15.2.3 创建客户端调用CEComServer 15.3 可连接点对象及示例 15.3.1 可连接点对象概述 15.3.2 连接点示例 15.4 创建ActiveX控件 15.4.1 ActiveX概述 15.4.2 使用MFC向导创建一个简单的ActiveX控件
1,abkemail.ZIP简单的email控件(18KB ) 2,abkpop.ZIP一个简单的POP3控件(5KB)3,winpopup.ZIP允许您的程序通过网络发送和接收 Winpopup 信息(20KB)4,autodial.ZIP 自动拨号的控件(30KB)5,ddialw.EXE DameWare公司出品的电话拨号控件(170KB)6,dipw.EXE DameWare 公司出品 IP 地址控件(169KB)7,dm10e.ZIP 发送 E.Mail 的控件(117KB)8,dsdns_eval.EXE IP地址控件(703KB)9,easyftp.ZIP FTP 登录控件,就象 Cute FTP(195KB)10,firewall.EXE 防火墙控件(534KB)11,ftpx.EXE FTP客户端控件和 COM 对象(629KB)12,ftpserv.EXE FTP服务器端控件和COM对象(523KB)13,httpx.EXE HTTP客户端控件和COM对象(644KB)14,mail.EXE 邮件控件(797KB)15,news.EXE 新闻组控件(664KB)16,ntuserx.EXE NT用户管理对象(426KB)17,pingx.EXE PIN 控件和COM对象(423KB)18,rasx.EXE RAS拨号控件(466KB) 19,socketx.EXE WinSock 控件(589KB)20,whoisx.EXE Internet WhoIs(域名查找)控件和 COM 对象(436KB)21,rasdialw.EXE rasdialw(162KB)22,i006_dlweb.zip利用Winsock控件下载网页(2KB)23,i005_hlink.zip将这个控件加到你的窗体上,并设置好URL,当点击该控件时,你就可以打开一个网站或启动默认的电子邮件程序或是其它指定的程序。此外,你还可以改变颜色、字体、边框以及鼠标悬停状态等。24,i004_ftp.zip如果你想DIY一个CUTEFTP之类的程序,用这个控件可大大简化你的工作量。(46KB)25,kchatocx.zipchat控件(16KB)26,kpopocx.zip一个简单的pop控件(14KB)27,krnicnntpocx.zip一个在新闻组读取和发送消息的控件(23KB)28,ocsetup10.exe检测用户是否在线的控件(266KB)29,dnslookup.zip查找网络计算机的主机名或ip地址(17KB)30,gotoweb.zip使用默认的浏览器浏览指定web页面(12KB)31,mailnotification.zip在pop3邮件服务器检测邮件的控件(17KB)32,easyras.zip一个拨号上网的ras控件(155KB)33,onoffline.zip在线检测和断开internet(14KB)34,ping.zipping一个主机(24KB)35,popmail.zip从pop邮件服务器上获得邮件的控件(20KB)36,smtp.zip通过smtp服务器发送邮件的控件(19KB)37,trace.zip跟踪主机的route(23)38,dynamichtml.zip在visual basic中使用动态超文本(dhtml)(12KB)39,rasdialx.zip网络拨号控制,还能得到许多相关信息(93KB)40,abkemail.zip一个简单的email控件(18KB)41,internet.zip对http,ftp,email,mime,news等进行编程的一套internet控件(413KB)42,ipocxes.zip两个OLE控件(Client和Server),可以用来在Internet上进行TCP/IP通讯(23KB)43,dlinkacx.zip在这个程序中进行数据的通信,轻松帮助你完成“客户/服务器”设计(227KB)44,htmlpopu.zip在你的程序中弹出一个超文本窗口(343KB)45,bpmail.zip 邮件发送控件,完全免费的 OCX (14KB)46,dns.zip 转换IP地址为主机名的控件(12KB)47,hlink.zip 将这个控件加到你的窗体上,并设置好URL,当点击该控件时,你就可以打开一个网站或启动默认的电子邮件程序或是其它指定的程序。(有例程) (19KB)48,telnet.zipTelnet 例子(31KB)49,rasdialtest.zip拨号上网(35KB)50,cpop3conn_src.zippop3协议(19KB)51,csmtpconn_src.zipsmtp协议(23KB)52,hostnames.zip网络电脑列表(14KB)53,htmllinks.zip连接列表(136KB)54,ftp.zip文件上传(29KB)55,DSCRK32.zipDssocket是用来设计TCP/IP软件的VBX/OCX控件(780KB)56,DSSK165S.zip如WINSOCK一样的网络通讯软件的OCX/VBX控件(74KB)57,MS_INTERNET_OCX.zip内含微软公司的internet 编程套件,有WinSock Control、HTML Control、Winsock UDP Control等(2266KB)58,easyftp.zip让你建立一个自己的FTP登录工具,就象CuteFtp,cool!(195KB)
C++Builder精彩编程实例集锦的源代码(1,2,3部分): 第一部分 界面设计 实例001 如何实现程序闪屏效果 实例002 如何实现程序窗口闪烁 实例003 如何制作吸附窗口程序 实例004 如何制作透明程序窗口 实例005 如何制作半透明程序窗口 实例006 如何制作不规则程序窗口 实例007 如何制作程序渐变背景 实例008 如何设置程序背景图像 实例009 如何设置MDI程序背景图像 实例010 如何动态关闭MDI程序所有子窗口 实例011 如何去掉MDI程序子窗口标题栏 实例012 如何拖动非标题栏区域移动窗口 实例013 如何控制程序最小化窗口 实例014 如何限制程序最大最小化窗口 实例015 如何控制程序窗口自动隐藏或显示 实例016 如何隐藏应用程序 实例017 如何控制程序在任务栏上是否出现 实例018 如何使一个程序在任务栏同时出现多个标题 实例019 如何使程序窗口总在最前面显示 实例020 如何隐藏应用程序标题栏 实例021 如何设置程序主标题 实例022 如何设置程序图标 实例023 如何在程序中改变菜单位置 实例024 如何删除程序系统关闭菜单 实例025 如何拷贝当前程序界面 实例026 如何动态创建程序表单 实例027 如何遍历窗体所有组件 实例028 如何保证组件位置相对固定 实例029 如何在窗体中动态增加组件 实例030 如何使组件在程序运行时可以移动 实例031 如何使用组件创建托盘程序 实例032 如何使用动画组件播放动画 实例033 如何在状态栏上加载进度条 实例034 如何在编辑框内显示图像 实例035 如何在列表框中增加水平滚动条 实例036 如何在列表框中同时显示图像和文字 实例037 如何设置属性表组件标签图像 实例038 如何控制Memo组件的文字边界 实例039 如何使用代码控制文字滚动 实例040 如何纵向显示字符串 实例041 如何旋转显示字符串 实例042 如何设置显示文字分辨率 第二部分 程序设置 实例043 如何使用消息框 实例044 如何显示简单关于对话框 实例045 如何在程序中增加热键 实例046 如何在程序中自定义消息 实例047 如何在程序中自定义系统菜单 实例048 如何在执行程序间进行数据通信 实例049 如何使用OLE技术启动画图 实例050 如何在程序中添加Word文档表格 实例051 如何在程序中设置Word文档的字体风格 实例052 如何使用Onldle事件 实例053 如何使程序在循环时响应外界事件 实例054 如何设置程序在系统启动时自动运行 实例055 如何创建多线程程序 实例056 如何创建可独立执行程序 实例057 如何编写单文档应用程序 实例058 如何编写多文档应用程序 实例059 如何编写COM服务器程序 实例060 如何编写COM客户端程序 实例061 如何编写DDE服务器程序 实例062 如何编写DDE客户端程序 实例063 如何编写DLL服务器程序 实例064 如何编写DLL客户端程序 实例065 如何注册DLL服务器程序 实例066 如何制作聊天服务器程序 实例067 如何制作聊天客户端程序 实例068 如何获取程序名称和路径 实例069 如何获取程序命令行参数 实例070 如何析取动态链接库中的图标 实例071 如何设置Edit组件的文本选择范围 实例072 如何将小写金额转换成大写金额 实例073 如何将全角字符串转换成半角字符串 实例074 如何按照指定的有效位数转换数字 实例075 如何获取汉字的拼音索引 实例076 如何设置输入方法 实例077 如何控制数据输入格式 实例078 如何控制编辑框中的输入法 实例079 如何设置回车键后的焦点 实例080 如何将项目保存到对象库 实例081 如何检测鼠标信息 实例082 如何读取鼠标信息 实例083 如何实现鼠标拖动操作 实例084 如何限制鼠标活动范围 实例085 如何读取键盘信息 第三部分 文件操作 实例086 如何复制文件 实例087 如何定制文件复制操作 实例088 如何更名文件 实例089 如何更改文件扩展名 实例090 如何删除文件 实例091 如何删除文件夹 实例092 如何选择文件夹 实例093 如何创建多层文件夹 实例094 如何自动获取文件夹和文件 实例095 如何搜索指定目录下的文件 实例096 如何搜索指定目录下的隐藏文件 实例097 如何搜索文本文件中的字符串 实例098 如何替换文本文件中的字符串 实例099 如何将长文件名转换为短文件名 实例100 如何在文件打开对话框中选择多个文件 实例101 如何定制文件打开和关闭对话框 实例102 如何修改文件打开对话框的按钮标题 实例103 如何使用查找与替换对话框 实例104 如何获取和设置当前目录 实例105 如何判断文件类型 实例106 如何获取系统所有文件类型 实例107 如何获取和设置文件属性 实例108 如何获取和设置文件时间属性 实例109 如何对文件名函数进行操作 实例110 如何读写文本文件 实例111 如何打印文本文件 实例112 如何创建特大型文件 实例113 如何制作临时文件 实例114 如何启动帮助文件 实例115 如何使用组件在主机问传送文件 实例116 如何对文件进行编码和解码 实例117 如何设置RichEdit组件的存盘格式 实例118 如何在WIN.INI文件中保存程序信息 实例119 如何将数据转换成Word文档格式 实例120 如何直接从Excel文件导入数据 实例121 如何直接将数据导入到Excel文件 实例122 如何发送电子邮件(一) 实例123 如何发送电子邮件(二)
第一部分 界面设计 实例001 如何实现程序闪屏效果 实例002 如何实现程序窗口闪烁 实例003 如何制作吸附窗口程序 实例004 如何制作透明程序窗口 实例005 如何制作半透明程序窗口 实例006 如何制作不规则程序窗口 实例007 如何制作程序渐变背景 实例008 如何设置程序背景图像 实例009 如何设置MDI程序背景图像 实例010 如何动态关闭MDI程序所有子窗口 实例011 如何去掉MDI程序子窗口标题栏 实例012 如何拖动非标题栏区域移动窗口 实例013 如何控制程序最小化窗口 实例014 如何限制程序最大最小化窗口 实例015 如何控制程序窗口自动隐藏或显示 实例016 如何隐藏应用程序 实例017 如何控制程序在任务栏上是否出现 实例018 如何使一个程序在任务栏同时出现多个标题 实例019 如何使程序窗口总在最前面显示 实例020 如何隐藏应用程序标题栏 实例021 如何设置程序主标题 实例022 如何设置程序图标 实例023 如何在程序中改变菜单位置 实例024 如何删除程序系统关闭菜单 实例025 如何拷贝当前程序界面 实例026 如何动态创建程序表单 实例027 如何遍历窗体所有组件 实例028 如何保证组件位置相对固定 实例029 如何在窗体中动态增加组件 实例030 如何使组件在程序运行时可以移动 实例031 如何使用组件创建托盘程序 实例032 如何使用动画组件播放动画 实例033 如何在状态栏上加载进度条 实例034 如何在编辑框内显示图像 实例035 如何在列表框中增加水平滚动条 实例036 如何在列表框中同时显示图像和文字 实例037 如何设置属性表组件标签图像 实例038 如何控制Memo组件的文字边界 实例039 如何使用代码控制文字滚动 实例040 如何纵向显示字符串 实例041 如何旋转显示字符串 实例042 如何设置显示文字分辨率 第二部分 程序设置 实例043 如何使用消息框 实例044 如何显示简单关于对话框 实例045 如何在程序中增加热键 实例046 如何在程序中自定义消息 实例047 如何在程序中自定义系统菜单 实例048 如何在执行程序间进行数据通信 实例049 如何使用OLE技术启动画图 实例050 如何在程序中添加Word文档表格 实例051 如何在程序中设置Word文档的字体风格 实例052 如何使用Onldle事件 实例053 如何使程序在循环时响应外界事件 实例054 如何设置程序在系统启动时自动运行 实例055 如何创建多线程程序 实例056 如何创建可独立执行程序 实例057 如何编写单文档应用程序 实例058 如何编写多文档应用程序 实例059 如何编写COM服务器程序 实例060 如何编写COM客户端程序 实例061 如何编写DDE服务器程序 实例062 如何编写DDE客户端程序 实例063 如何编写DLL服务器程序 实例064 如何编写DLL客户端程序 实例065 如何注册DLL服务器程序 实例066 如何制作聊天服务器程序 实例067 如何制作聊天客户端程序 实例068 如何获取程序名称和路径 实例069 如何获取程序命令行参数 实例070 如何析取动态链接库中的图标 实例071 如何设置Edit组件的文本选择范围 实例072 如何将小写金额转换成大写金额 实例073 如何将全角字符串转换成半角字符串 实例074 如何按照指定的有效位数转换数字 实例075 如何获取汉字的拼音索引 实例076 如何设置输入方法 实例077 如何控制数据输入格式 实例078 如何控制编辑框中的输入法 实例079 如何设置回车键后的焦点 实例080 如何将项目保存到对象库 实例081 如何检测鼠标信息 实例082 如何读取鼠标信息 实例083 如何实现鼠标拖动操作 实例084 如何限制鼠标活动范围 实例085 如何读取键盘信息 第三部分 文件操作 实例086 如何复制文件 实例087 如何定制文件复制操作 实例088 如何更名文件 实例089 如何更改文件扩展名 实例090 如何删除文件 实例091 如何删除文件夹 实例092 如何选择文件夹 实例093 如何创建多层文件夹 实例094 如何自动获取文件夹和文件 实例095 如何搜索指定目录下的文件 实例096 如何搜索指定目录下的隐藏文件 实例097 如何搜索文本文件中的字符串 实例098 如何替换文本文件中的字符串 实例099 如何将长文件名转换为短文件名 实例100 如何在文件打开对话框中选择多个文件 实例101 如何定制文件打开和关闭对话框 实例102 如何修改文件打开对话框的按钮标题 实例103 如何使用查找与替换对话框 实例104 如何获取和设置当前目录 实例105 如何判断文件类型 实例106 如何获取系统所有文件类型 实例107 如何获取和设置文件属性 实例108 如何获取和设置文件时间属性 实例109 如何对文件名函数进行操作 实例110 如何读写文本文件 实例111 如何打印文本文件 实例112 如何创建特大型文件 实例113 如何制作临时文件 实例114 如何启动帮助文件 实例115 如何使用组件在主机问传送文件 实例116 如何对文件进行编码和解码 实例117 如何设置RichEdit组件的存盘格式 实例118 如何在WIN.INI文件中保存程序信息 实例119 如何将数据转换成Word文档格式 实例120 如何直接从Excel文件导入数据 实例121 如何直接将数据导入到Excel文件 实例122 如何发送电子邮件(一) 实例123 如何发送电子邮件(二) 第四部分 图像处理 实例124 如何浏览图像 实例125 如何滚动浏览大图像 实例126 如何拖动图像 实例127 如何动态显示图像 实例128 如何维护多个图像 实例129 如何绘制图形 实例130 如何以不规则方式裁剪图像 实例131 如何以任意角度旋转显示图像 实例132 如何在桌面上显示图像 实例133 如何拷贝当前屏幕 实例134 如何打印图像文件 实例135 如何制作马赛克图像 实例136 如何实现图像中心扩散效果 实例137 如何实现图像百叶窗效果 实例138 如何实现图像底片化效果 实例139 如何实现图像翻页效果 实例140 如何实现图像镜像效果 实例141 如何柔化处理图像 实例142 如何锐化处理图像 实例143 如何雾化处理图像 实例144 如何将彩色图像转换成黑白图像 实例145 如何将BMP图像文件转换为JPG图像文件 实例146 如何全屏播放AVI文件 实例147 如何制作媒体播放器 第五部分 系统编程 实例148 如何获取键盘类型 实例149 如何获取声卡配置 实例150 如何获取处理器信息 实例151 如何获取系统元素颜色 实例152 如何获取显示元素信息 实例153 如何获取系统支持的显示模式 实例154 如何动态设置系统的显示模式 实例155 如何获取内存空间信息 实例156 如何获取磁盘类型 实例157 如何获取磁盘卷信息 实例158 如何获取磁盘空间信息 实例159 如何在我的电脑中隐藏磁盘 实例160 如何隐藏系统任务栏 实例161 如何隐藏桌面图标 实例162 如何在桌面上创建快捷方式 实例163 如何获取和设置桌面墙纸 实例164 如何设置桌面墙纸显示方式 实例165 如何进行系统桌面切换 实例166 如何禁止系统屏幕保护程序 实例167 如何在程序中启动系统屏幕保护程序 实例168 如何在开始右键菜单中添加菜单项 实例169 如何清空系统回收站 实例170 如何删除文件到回收站 实例171 如何启动控制面板程序 实例172 如何在系统控制面板中添加项目 实例173 如何为计算机增加启动日志 实例174 如何获取操作系统的启动模式 实例175 如何变暗屏幕颜色 实例176 如何关闭计算机 实例177 如何禁止关闭Windows操作系统 实例178 如何修改IE浏览器的背景 实例179 如何在程序中控制IE窗口 实例180 如何使用默认浏览器打开指定网页 实例181 如何获取当前正在运行的程序 实例182 如何监视系统剪贴板变化 实例183 如何获取系统剪贴板的数据格式 实例184 如何设置系统日期 实例185 如何获取操作系统的产品序列号和产品名称 实例186 如何获取和设置鼠标双击响应速度 实例187 如何弹出和关闭光驱 实例188 如何检测网络连接 实例189 如何创建拨号网络 第六部分 数据库应用 实例190 如何创建不写代码的数据库程序 实例191 如何添加TDBNavigator组件的按钮功能 实例192 如何对数据库记录求和 实例193 如何对数据库记录求平均值 实例194 如何使用Locate方法查询数据库记录 实例195 如何查询固定范围的数据库记录 实例196 如何提高数据库应用程序查询效果 实例197 如何使用数据集的书签 实例198 如何浏览数据库中的图像 实例199 如何在删除数据库记录前给予提示 实例200 如何取得数据集的当前状态 实例201 如何创建主从关系的数据集 实例202 如何在一个数据集中浏览另一个数据集的数据 实例203 如何在数据库更新过程中增加事务操作 实例204 如何在程序中实现查找字段 实例205 如何在程序中实现自定义字段 实例206 如何使用字段拖放功能 实例207 如何为程序添加报表打印功能 实例208 如何使用向导创建打印报表 实例209 如何设置一对多数据库表 实例210 如何设置一对多报表打印功能 实例211 如何根据一对多数据库表绘制图形 实例212 如何根据数据库表显示饼图 实例213 如何根据数据库表绘制条形图 实例214 如何动态绘制数据库图表 实例215 如何设置多重群组的打印报表 实例216 如何编写商业决策分析程序 实例217 如何导出对象库中的商业决策分析程序 实例218 如何打印含有图像字段的数据库表 实例219 如何实现数据库表整表复制 实例220 如何实现数据库记录的批量删除 实例221 如何实现数据库记录的批量修改 实例222 如何使用SQL Builder工具创建SQL语句 实例223 如何在程序运行时指定SQL语句 实例224 如何在程序中创建并使用数据库 实例225 如何在程序中控制与数据库的连接 实例226 如何在程序中创建Access数据库ODBC数据源 实例227 如何在程序运行时创建数据库BDE别名 实例228 如何在安装程序中设置BDE引擎 实例229 如何消除MS-SQL Server数据库连接的登录框 实例230 如何连接MS-SQL Server数据库 实例231 如何连接MS-Access数据库 实例232 如何连接dBase数据库 实例233 如何使用ODBC连接Excel表 实例234 如何使用ADO操作Access数据库 实例235 如何定制DBGrid组件的列表头 实例236 如何统计DBGrid组件多选单元格 实例237 如何设置DBGrid组件指定单元格的颜色值 实例238 如何在DBGrid组件单元格中增加下拉菜单 实例239 如何定制StringGrid组件指定单元格的颜色 实例240 如何获取StringGrid组件鼠标指定单元格的值 实例241 如何使用StringGrid组件显示数据库查询结果 实例242 如何禁止数据控制组件与数据集组件同步刷新 实例243 如何把数据库表转换成文本文件 实例244 如何把数据库中的数据写入Word文档 实例245 如何设置数据库字段的输入显示格式 实例246 如何管理数据库程序的错误信息 实例247 如何获取数据库BDE别名 实例248 如何获取数据库BDE别名参数信息 实例249 如何获取数据库的工作目录 实例250 如何获取数据库驱动程序名称
第一部分 了解COM 第1章 COM概述 何谓CoM COM术语 COM利与弊 COM的好处 COM的局限性 COM组件与接口 何谓接口 接口特征 接口类型 接口规则 接口设计 COM组件的实现规则 实现IUnknown规则 内存管理规则 引用计数规则 COM激活 COM类型 COM客户机 COM服务器 ActiveX控件 COM与面向对象技术 包装 抽象 多态 继承 COMTrader应用程序 小结 第2章 由VC++建立并使用COM服务器 IDL文件 建立第一个COM服务器 定义自定义接口 实现IUnknown和自定义接口 完成COM服务器 生成测试客户机 用ATL建立COM服务器 关于ATL 用ATL建立进程内COM服务器 用ATL建立进程外COM服务器 线程与COM服务器 Win32多线程应用 线程COM组件 自动化与IDispatch 用VC++实现IDispatch ATL与自动化 Automation数据类型 再谈类型库 C++自动化客户机 VB自动化客户机 小结 第3章 用VB建立并使用COM服务器 选择COM项目 设计接口 描述接口 浏览接口 生成对象 使用ClassBuilder 增加属性 增加方法 增加事件与枚举 使用ActiveXDataObject(ADO) 在服务器组件中使用Recordset对象 在客户机组件中使用ADOR 生成断开的Recodset 生成自己的RecodsctS 使用用户定义类型 错误处理 服务器客户机错误处理 使用VBErr.Raise机制 在VB中使用线程模型 设置线程模型 了解再入性与公寓 小结 第二部分 COM与Internet 第4章 在VC++中建立并使用ActiveX控件 ACtiveX控件概还 属性与方法 控件与容器通信 事件与连接点 建立第一个控件 生成控件 测试控件 增加方法 增加属性 增加事件 增加属性页 允许属性保持 使用控件 建立复合控件 增加复合控件 增加功能 增加事件 处理复合控件事件 处理错误 使用控件 小结 第5章 在VB中建立并使用ActiveX控件 VB控件简介 约束与无约束控件 控件生成技术 属性类型 方法 属性配置 过程属性 环境属性配置 运行时只读属性 只在运行时有效的属性 扩展属性 容器属性 合成控件属性 可关联属性 持续与属性包 属性包 使用ActiveX控件界面向导 了解控件寿命 生成ActiveX控件 生成无约束控件 生成设计时数据约束控件 生成运行数据约束控件 小结 第6章 用VC++建立InternetCOM组件 IEActiveX控件 轻量级控件 安全控件 持续属性 文档对象模型编程 活动服务器组件 活动服务器页面 ASP页面的COM组件 小结 第7章 用VB建立InternetCOM组件 无窗口控件 ActiveX控件容器的线程模型 ActiveX控件的安全性 Web页面访问 VBDHTML项目 DHTML项目基础 DHTML应用程序样本 VBIIS应用程序 WebClass 一个IIS应用程序样本 设计控件 设计控件与HTML文件 样本设计控件 小结 第三部分 了解DCOM 第8章 DCOM概述 何谓DCOM 为什么使用DCOM DCOM操作 DCOM组件位置 进程内或进程外组件 代理 RPC(RemoteProcedureCall,远程过程调用) 调动 数据传递 DCOM配置实用程序 DCOM应用程序的安全机制 验证 授权 加密 整性检查 小结 第9章 用VC++建立DCOM服务器 标准与自定义调动 标准调动 自定又调动 网络通伯 远程激活 AppID注册表项 可配置AppID注册表项参数 IUknown优化 DCOM与NT服务 NT服务解剖 基于NT服务的COM服务器 小结 第10章 用VB建立DCOM服务器 应用程序对象模型 何谓对象模型 如何生成对象模型 DCOM设计准则与技术 再论调动 按数值与按引用 DCOM进程外服务器 建立DCOM组件 增加测试客户机 IIS应用程序 增加WebClasses 使用模板 增加自定义Webltems 远程错误处理 小结 第四部分 了解COM++ 第11章 COM++概述 COM与WindowsDNA 用户界面层技术 中间层技术 数据库层技术 组件服务配置 事务处理 排队组件(QC) 实时结构的限制 事务性消息排队 排队组件结构 排队组件故障恢复 QC安全性 动态负荷平衡 对象地 小结 第12章 用VC++建立COM++组件 ADO编程 ADO与OLEDB VC++中的ADO VC++的ADO扩展 建立COM++应用程序 温习IObjectContext接口 用ATL建立COM++组件 编制基于角色的安全性 处理COM+事务 控制事务结果 指定事务属性 确定事务情境 传递接口指针 共享状态 建立事务性COM+组件 小结 第13章 用VB建立COM+组件 了解事务 事务与多层应用程序 COM+与事务 事务属性:ACID COM+系统简介 COM+运行环境 COM+ComponentServices COM+接口 资源分配器 应用程序组件 探索COM+编程模型 COM+组件作为COMDLL 基本COM+编程规则 COM+API 用VB编程COM+ 对象描述表 COM+组件的生命周期 ObjectControl接口 MTS活动 COM+中生成对象 安全引用 组件之间的参数传递 数据类型 使用分布式事务 分布式事务协调器(MSDTC) COM+事务的工作 事务与有状态对象 使用共享属性管理器(SPMSharedProperyManager) 小结 第14章 了解MSMQ 何谓MSMQ MSMQ的好处 MSMQ组件 队列 消息 MSMQ对象模型 MSMQ设置 MSMQ基础 消息发送 消息接收 MSMQ事件 MSMQ事务 小结 第五部分 高级COM与COM+ 第15章 VC++与VB中的COM+服务 了解COM+激活 描述表包装器 激活顺序 使用即时(JIT)激活 使用对象构造 中性公寓简介 了解同步域 表示事务状态 取得对象信息 使用对象地 对象池的好处 对象地要求 对象地配置 使用排队组件 QC限制 QC配置 QC调用 QC播放控件 使用负荷平衡 负荷平衡要求 负荷平衡配置 小结 第16章 COM与COM+安全性 何谓安全性 WindowsNT安全简介 NT验证 NT扮演 NT访问控制 COM安全结构 验证 访问控制 启动权限 标_ 扮演与掩盖 安全总括 COM+安全 COM+说明性安全 COM+角色 编程COM与COM+安全 整个进程安全 接口级安全 激活安全 服务器方安全 调用描述表安全信息 SecuntyProperty信息 安全性与数据库访问 小结 第17章 Windows2000中的新COM特性 同步机制 COM同步API COM同步接口 异步COM 异步接口构造 异步接口调用 关于异步服务器与客户机 让服务器进行异步处理 调用序列化与自动完成 COM管道 COM管道接口 异步管道与提前读取 调用对象与调用取消 调用取消请求 调用取消处理 轻量级处理器 标准LWH 自定义LWH 小结 第六部分 调试与部署COM和COM+应用程序 第18章 调试与剖析COM和COM+应用程序 调试VB组件 调试MTS组件 调试COM+组件 使用条件编译 调试VC++组件 用VisualStUdioAnalyzer剖析 小结 第19章 部署COM与COM+应用程序 DCOM应用程序部署 配置DCOM服务器 配置DCOM客户机 在Internet上部署 Internet上部署与包装 签名CAB文件 许可ActiveX控件 自动化COM+配置 使用COMAdmin接口与集合 配置COM+应用程序 配置组件 配置角色 部署COM+应用程序 小结

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值