2006年06月23日

最近看到好多人在询问mysql 导入导出的问题,于是就简单的总结一些我的使用经验,供大家参考,有不合理的地方欢迎交流!

一、Mysql 数据的导出

   有的站长经常用一种最直接的办法就是拷贝数据库文件夹的办法,这个方法确实简单,但是不提倡,在跨版本或者跨不同字符集系统是很容易出问题。再说了数据库4.1版本有两种存储数据的方式在配置的时候可选,一种是和以前一样的每个数据库存放在单独的文件夹里,另一种叫什么来着我忘了,这种所有的数据库都放在一个文件里,巨大的一个文件!,所以对于后者就不可以用拷贝的方法了,用什么呢?下面介绍:

   就是mysql 自带的工具 mysqldump ,这个工具十分强大,可以导出数据,并且可以导出不同版本的数据、也可以导出用于其他数据库的数据,太牛了。 这个工具实在命令行、cmd下用的 ,如果你的msyql/bin目录没有配置在系统的环境变量里,就先cd到mysql/bin目录。
   
1、    先介绍简单得导出: mysqldump -u 数据库用户名 -p  数据库名称 [表名] > 导出到文件的路径名

   例如:我要导出 test_db 这个数据库  我的数据库用户为 root 没有密码(没有密码就不用加 -p 了):
            mysqldump -u root test_db > c:\test.sql    这样就可以到处test这个数据库了
           如果我要导出 test 数据库中的user 表  用 ajin 这个用户 密码是 123
           mysqldump -u ajin -p test_db user >c:\test_user_table.sql   回车后提示输入密码就可以了

2、 在导出过程中改变数据库默认的字符集
        
   例如: 我要导出 test_db 这个数据库  转换编码为 utf8 (utf8 我最常用的)
  
      mysqldump -u ajin -p –default-character-set=utf8  test_db >c:\test.sql    就可以了  
     转换成其他字符只需替换 utf8 就可以了

3、导出不同版本数据或者导出给数据库用的数据

  例如:我的数据库 Mysql 4.1 的 我要导出一个 默认字符集 utf8 的 4.0版本的数据

    mysqldump -u ajin -p test_db –compatible=mysql40 –default-character-set=utf8 test_db >c:\test.sql   

   就可完成了所谓的降级 –compatible= 可以跟得参数有 mysql323 mysql40 oracle mssql db2 等等

导出就介绍这些常用的,其实还有好多好多。。省略一千字…..

二 数据的导入  

   这个相对就比较简单了,   这个在命令行、cmd下用的 ,如果你的msyql/bin目录没有配置在系统的环境变量里,就先cd到mysql/bin目录。
  
  比如我要导入 test.sql 这个数据到  discuz_db 这个数据库

  mysql -u ajin -p discuz_db <c:\test.sql  回车提示输入密码 ,如果没有密码的用户 就不用加 -p 了

好了就先总结这么多,欢迎大家交流,其中不免会有错误,请多指教~~

2006年06月22日

这篇文章来自是Mukund Pujari的《Some Cool Tips for .NET》,本人给大家翻译总结一下,我英语水平也就那么回事,不合适的地方还是请大家提出来。

1. 如何创建一个可改变大小没有标题栏的窗体?(How to create a form with resizing borders and no title bar?)

form1.Text = string. Empty;
form1.ControlBox = false;


2. 如何在.NET的Windows窗体上启用XP主题集?(How to use XP Themes with Windows Forms using the .NET?)

确认你的控件中FlatStyle属性已经修改为System,再修改Main方法。

static void Main()
{
  Application.EnableVisualStyles();
  Application.DoEvents();
  Application. Run(new Form1());
}


3. 如何为一个窗体设置一个默认按钮?(How to set the default button for a form?)

form1.AcceptButton = button1;

4. 如何为一个窗体设置一个取消按钮?(How to set the Cancel button for a form?)

form1.CancelButton = button1;

5. 如何阻止一个窗体标题显示在任务栏上?(How to prevent a form from being shown in the taskbar?)

设置窗体的ShowIntaskbar属性为False

6. 如何用现有可用字体绑定到ComboBox控件?(How to fill a ComboBox with the available fonts?)

comboBox1.Items.AddRange (FontFamily.Families);

7. 如何禁止TextBox控件默认的邮件菜单?(How to disable the default ContextMenu of a TextBox?)

textBox1.ContextMenu = new ContextMenu ();

8. 如何获取“我的文档”等一些系统文件夹路径?(How to get the path for "My Documents" and other system folders?)

Environment.SpecialFolder中包含了一些系统文件夹信息
MessageBox.Show(Environment.GetFolderPath( Environment.SpecialFolder.Personal ));

9. 如何获取应用程序当前执行的路径?(How to get the path to my running EXE?)

string appPath = Application.ExecutablePath;

10. 如何确定当前运行的系统?(How to determine which operating system is running?)

OperatingSystem os = Environment.OSVersion;
MessageBox.Show(os.Version.ToString());
MessageBox.Show(os.Platform.ToString());

11. 如何从完整的路径中获取文件名?(How to get a file’s name from the complete path string?)

用System.IO.Path.GetFileName 和 System.IO.Path.GetFileNameWithoutExtension(无扩展名)的方法

12. 如何从完整的路径中获取文件扩展名?(How to get a file’s extension from the complete path string?)

用System.IO.Path.GetExtension方法

13. 如何使没有选择日期的DateTimePicker控件为空文本?(How to make the DateTimePicker show empty text if no date is selected?)

dateTimePicker1.CustomFormat = " ";
dateTimePicker1.Format = DateTimePickerFormat.Custom;

14. 如何在Report Viewer中隐藏Crystal Report的状态栏?(How to hide the status bar of Crystal Report in Report Viewer?)

foreach(object obj in this.crystalReportViewer1.Controls)
{     
  if( obj.GetType()== typeof(System.Windows.Forms.StatusBar))
 {     
  StatusBar sBar=(StatusBar)obj;
  sBar.Visible=false;
 }     
}


15. 如何利用Crystal Report程序来生成PDF版本?(How to generate PDF version of Crystal Report programmatically?)

ReportDocument O_Report=new ReportDocument();
ExportOptions exportOpts = new ExportOptions();
PdfRtfWordFormatOptions pdfFormatOpts = new PdfRtfWordFormatOptions ();
DiskFileDestinationOptions diskOpts = new DiskFileDestinationOptions();
exportOpts = O_Report.ExportOptions;
// 设置PDF格式   
exportOpts.ExportFormatType = ExportFormatType.PortableDocFormat;
exportOpts.FormatOptions = pdfFormatOpts;
// 设置文件选项和导出
exportOpts.ExportDestinationType = ExportDestinationType.DiskFile;
diskOpts.DiskFileName = "C://Trial.pdf"; //设置PDF导出路径    
exportOpts.DestinationOptions = diskOpts;
O_Report.Export ();


16.通过代码如何输入多行文本?(How to enter multiline text in textbox through code? )

利用TextBox控件的LINES属性
string [] strAddress = {"Mukund Pujari","Global Transformation Technologies","Pune, India"};
textBox1.MultiLine=true;
textBox1.Lines=strAddress;

或者
textBox1.Text="Line 1\r\nLine2\r\nLine3.";

或者
用"System.Environment.NewLine"来替代换行符号

17. 如何在DataGrid中去掉CheckBox不确定状态?(How to remove the indeterminate status of checkbox in datagrid?)

DataGridTableStyle ts1 = new DataGridTableStyle(); //创建Table样式
ts1.MappingName = "Items"; //分配要应用样式的Data Table
DataGridColumnStyle boolCol = new DataGridBoolColumn(); // 创建CheckBox列
boolCol.MappingName = "ch"; //分配数据列名称
boolCol.AllowNull=false; // 修改AllowNull属性

18. 如何在用一个数据源DataTable绑定两个控件,确保变化不反映在两个控件中?( How to bind two controls to the same DataTable without having changes in one control also change the other control?)

我们在一个Form中放置一个ListBox和一个ComboBox控件,当数据源是一个DataTable而且绑定的ValueMember一致的时候我们选择ListBox中的一个Item时,ComboBox控件中的相同的Item也会被自动选中,我们可以采取建立新的上下文绑定对象来拒绝这样的同步操作
comboBox1.DataSource = dataset.Tables[ "Items" ];
comboBox1.ValueMember = "CustomerID";
comboBox1.DisplayMember = "CustomerID";

listBox1.BindingContext = new BindingContext(); // 设置新的上下文绑定对象
listBox1.DataSource = dataset.Tables[ "Items" ];
listBox1.ValueMember = "CustomerID";
listBox1.DisplayMember = "CustomerID";

19. 一个简单的创建链接字符串的方法。(An easy way to build connection string.)

记事本创建一个New.udl的文件,一个Microsoft 数据链接文件
双击打开,熟悉吧
按照向导创建完成一个数据库链接,测试成功
确定后,链接字符串写入这个文件,用记事本打开就看到了

20. 如何打开客户端E-Mail程序,Windows应用和Web应用?( How to open default E-mail client on your system with all parameters entered in it,like Outlook Express or Eudora, from your .NET windows or Web Application? )

Web Application:
A href="mailto:email@address1.com,email@address2.com?cc=email@address3.com&Subject=Hello&body=Happy New Year"

Windows Application:
引用System.Diagnostics.Process 命名空间
Process process = new Process();
process.StartInfo.FileName = "mailto:email@address1.com,email@address2.com?subject=Hello&cc=email@address3.com
&bcc=email@address4.com&body=Happy New Year" ;
process.Start();

21. VB.NET和C#有什么不同?( What is difference beween VB.NET and C#.NET? )

去微软下载一个文档吧,http://download.microsoft.com/download/6/3/5/6354bf47-c597-4029-89e9-2495e7539ab9/vbcsharpwp.exe

22. How to find whether your system has mouse or the number of buttons, whether it has wheel, or whether the mouse buttons are swapped or size of your monitor and many such information?

23. 如何使Windows Form上的Panel或者Label控件半透明?(How to make a Panel or Label semi-transparent on a Windows Form? )

通过设置控件背景色的alpha值
panel1.BackColor = Color.FromArgb(65, 204, 212, 230);
注意:在设计时手动输入这些值,不要用颜色选取

24. C#程序的主函数写[STA Thread] 属性是什么目的?(What is the purpose of the [STA Thread] attribute for the Main method of a C# program? )

http://community.csdn.net/Expert/topic/4132/4132313.xml?temp=.2285272


25. 如何触发Button的Click事件?(How to trigger a button click event? )

button1.PerformClick();

2006年06月20日

作 者: 缠绵整理
来 源: 力富数字视频网
浏 览 18518


最近在网上无意中看到一篇好文章,解决了许多人的刻不了800多M片子的问题. 相信下片子的兄弟都遇到过没法刻大于700M的片子,只好让片子放在硬盘里占空间,如果硬盘出了问题, 那就只有:(…

现把文章贴出来,希望对NIUGUO的兄弟们有所帮助!!!

光盘超级刻录设置!
1、在开始刻录前首先需要在Nero中进行参数设置,设置方法如下:
单击菜单:文件->参数选项->常规,将“红色标志”调整为90分钟。

2、选中“专家功能”选项页,选中允许超刻功能。

3、从“文件”菜单下选择“刻录镜像文件”,然后单击工具栏上的刻录按钮,在刻录方式下选择“Disk at once”选项。

4、这时Nero会提醒光盘容量不足,不用理会,之后会出现以下提示信息,单击“刻录超烧光盘”按钮开始刻录。接下来只要等待刻录结束即可。

5、注意事项,由于Nero的超烧功能必须在Disk at Once模式下才能使用.

Nero超刻DVDrip的方法

很多论坛会员下载了DVDrip电影后,想很好的收藏保存,但往往电影文件加上字幕文件后,正常的方法刻录一张700M的盘片就放不下了,这时光盘超刻就显得十分重要。在此我写一篇超刻的文章,希望对大家有所帮助。

一:盘片检测

建议如果条件允许的话,购买时尽量选择一些品牌的盘片,因为现在随着刻录机的普及,盘片的选择也逐渐多起来,单张单价在2元左右(因地而异)就可以选择到一些不错地品牌盘片,譬如:Ritek(铼得)、Benq/Acer (宏基)、Unibit (优百特)等等,因为其实制作盘片得厂商就这么几家,很多都时OEM再打商标得,比如:Unibit
(优百特)就是Ritek(铼得)的OEM产品。好的品牌的盘片不怎么会飞盘,保存的时间也比较长,重要一点,不挑刻录机,所以建议以50张或100张为单位一次性购买,可以很好还价。广州现在Unibit (优百特)50片一桶装A级盘片单张价格是1.6元,大家可以参考。

买来盘片之后,要想了解盘片可以超刻多少分钟,多少容量,最简单的方法之一,就是用Nero附带的工具,具体方法如下:

1、首先在刻录机里放进空白的CD-R盘片,然后在【开始】菜单里选择Nero CD Speed程序如图 :

2、选择下拉菜单里盘片超刻测试(如图2)

3、出现测试窗口后,还有盘片的基本资料,包括容量,时间,制造厂商,盘片类型等,选择start开始测试(如图3)

4、刻录机会模拟超刻过程,别担心,不是真的刻录进去,完成后会出现一个提示框,说明盘片可超刻的总时间和比正常多出的时间,并问你要不要保存资料。可选YES保存。(如图4、5)

图五:

5、最后的出图:绿色表示正常刻录的部分,黄色表示可以超刻的部分,下面是具体参数,选close关闭退出。(如图6)

盘片的选择介绍完了,下面介绍如何刻录:
二:刻录
1、打开Nero,如果有跳出下面的画面,请退出精灵(有的汉化说向导)。

2、打开Nero菜单栏上的“烧录器”中的“选择烧录器”。

然后就跳出一个对话框,里面会告诉你,你是刻录机是否已安装正确、是否支持超刻,还有其它一些相关信息。
注意:如果没有显示支持超刻的话,就不要使用超刻,不然就会损坏你的光盘和刻录机;还有你确信你的刻录机支持超刻的话,而上面又没显示支持,那有可能是你的注册码错误,你可以用注册机算出正确的注册码,重新输入后再看看情况。

3、打开Nero菜单栏上的“档案”,选择“偏好设定”,

然后跳出一个对话框,选择“进阶级属性”(有的汉化叫专家设置),打开超刻功能,输入比80分钟大的数字,我一般用99分钟(当然你也可以输入再大点的,但现在市面上最多为800M的超容量刻录盘,可写入时间为90分钟,所以99分钟也就够了)。

4、打开Nero菜单栏上的“档案”,打开新档案,把要刻录的内容拖到空白框里面,然后在Nero菜单栏上的“档案”中选择开始烧录光盘,

跳出一个选项框,现在你要选择“多重区段”中的“无多重区段

然后按“烧录”,进入另一个选项框,把“终结CD(这片CD就不能再烧资料进去!)”这项勾上,在写入方法中选择“光盘一次烧录(DAO)”
注意:只有选中“无多重区段”才能将写入方法激活。
5、上面都做好后,按“烧录”旁边的“新建”后,如果你的资料容量大于703M,过2秒后就会跳出下面的超刻的对话框,你只要选“超烧”就OK了!

2006年06月15日

动态链接库DLL的链接

  应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息。Visual C++6.0在VC\bin目录下提供了一个名为Dumpbin.exe的小程序,用它可以查看DLL文件中的函数结构。另外,Windows系统将遵循下面的搜索顺序来定位DLL: 1.包含EXE文件的目录,2.进程的当前工作目录, 3.Windows系统目录, 4.Windows目录,5.列在Path环境变量中的一系列目录。

  1.隐式链接

  隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。实现隐式链接很容易,只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以了。下面的例子通过隐式链接调用MyDll.dll库中的Min函数。首先生成一个项目为TestDll,在DllTest.h、DllTest.cpp文件中分别输入如下代码:


//Dlltest.h
#pragma comment(lib,"MyDll.lib")
extern "C"_declspec(dllimport) int Max(int a,int b);
extern "C"_declspec(dllimport) int Min(int a,int b);
//TestDll.cpp
#include
#include"Dlltest.h"
void main()
{int a;
a=min(8,10)
printf("比较的结果为%d\n",a);
}


  在创建DllTest.exe文件之前,要先将MyDll.dll和MyDll.lib拷贝到当前工程所在的目录下面,也可以拷贝到windows的System目录下。如果DLL使用的是def文件,要删除TestDll.h文件中关键字extern "C"。TestDll.h文件中的关键字Progam commit是要Visual C+的编译器在link时,链接到MyDll.lib文件,当然,开发人员也可以不使用#pragma comment(lib,"MyDll.lib")语句,而直接在工程的Setting->Link页的Object/Moduls栏填入MyDll.lib既可。

  2.显式链接

  显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来,动态链接库的文件名即是上述两个函数的参数,此后再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。下面是通过显式链接调用DLL中的Max函数的例子。


#include
#include
void main(void)
{
typedef int(*pMax)(int a,int b);
typedef int(*pMin)(int a,int b);
HINSTANCE hDLL;
PMax Max
HDLL=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件;
Max=(pMax)GetProcAddress(hDLL,"Max");
A=Max(5,8);
Printf("比较的结果为%d\n",a);
FreeLibrary(hDLL);//卸载MyDll.dll文件;
}

  在上例中使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针,然后通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄,然后通过GetProcAddress()函数获取导入到应用程序中的函数指针,函数调用完毕后,使用FreeLibrary()卸载DLL文件。在编译程序之前,首先要将DLL文件拷贝到工程所在的目录或Windows系统目录下。

  使用显式链接应用程序编译时不需要使用相应的Lib文件。另外,使用GetProcAddress()函数时,可以利用MAKEINTRESOURCE()函数直接使用DLL中函数出现的顺序号,如将GetProcAddress(hDLL,"Min")改为GetProcAddress(hDLL, MAKEINTRESOURCE(2))(函数Min()在DLL中的顺序号是2),这样调用DLL中的函数速度很快,但是要记住函数的使用序号,否则会发生错误。

编程时用ad.h,ad.lib,放在项目当前目录里

在头文件中加入#include "ad.h"

在Project Setting–>Link–>Object/library modules
加入ad.lib

执行时将ad.dll跟你的程序放在同一目录

我们在编写程序,开发软件的过程中如果能利用已有的程序的功能,那么可以大大减轻开发过程中程序员的工作量,同时达到事半功倍的效果。例如在工程中,许多软件需要文字处理功能,虽然MFC提供了一些方法,但是具体实现起来既费事,又有一定的困难,如果我们可以直接使用OFFICE提供的功能,岂不美哉!要实现这一目的,只需要利用微软的ActiveX Automation技术就可以轻松实现。本例主要讲述了自动化的概念,并通过一个操作Word文档的程序来帮助读者朋友理解Visual C++编程中如何实现自动化。

  一、实现方法

  1.自动化的概念

  在Windows程序开发中,自动化是基于COM/DCOM之上的技术:它可以使一个应用程序来操纵另外一个程序中的对象,使用该程序提供的丰富的功能;或者是一个应用程序通过提供一些对象及对象的方法和属性来允许另外一个程序使用它提供的各种功能。其中,根据程序是受惠者还是施惠者这一原则,将提供对象和对象属性方法的应用程序称为自动化服务器端;使用对象属性方法的应用程序叫作自动化的客户端。自动化服务器让其它程序告诉它做些什么,它揭示的函数和数据称为方法(Methods)和属性(Properties)。例如Microsoft Office套件中的成员Word、Excel等都是自动化服务器。根据自动化的客户端和服务器端的不同位置,又可以将自动化分为两类:

  1)如果作为服务器端和客户端的两个不同的应用程序都在同一台计算机上,叫作本地自动化;

  2)如果作为服务器端和客户端的两个不同的应用程序是基于网络的,分别处于不同的计算机上,叫作远程自动化。

  需要读者朋友注意的是,由于利用了COM技术,客户端无法直接获得服务器端的对象来实现对它的访问,它必须通过获取一个指向接口的指针来使用对象提供的功能。这个接口称为IDispatch,它是一个简化的使用多种不同语言的特殊接口(包括象Visual Basic这样不能使用指针的语言)。这部分内容读者可以在下面的程序实现过程中细细体味。

  说到自动化,不能不提一下ActiveX控件,它其实是在进程中装入的极小自动化服务器。这意味着它们的执行速度极快,它们原来被称为OLE自定义控件,用来替代VB和Visual C++中使用的16位的VBX控件。由于ActiveX控件通常被保存为.OCX文件,所以又称它为OCX控件。因为控件是一个小型化的自动化服务器,它们需要在自动化客户端使用,我们又将这时的客户端应用程序称为容器应用程序。ActiveX控件除了属性和方法外,还包含事件(events),当一些事情需要容器应用程序注意时,控件才会触发一个事件,如用户的单击等。

  2.自动化中的数据类型

  在实现自动化编程中,最重要的一个问题是程序员要明白在自动化的客户端和服务器端数据是如何传递的。如何提供一个统一安全的机制来实现数据传递呢?在Visual C++开发平台上,它提供了一个叫VARIANT的数据类型来解决这个问题。该数据类型有两部分组成,第一部分为数据的类型,第二部分才是具体的数据的数值。在VARIANT数据类型的基础上,VC提供了ColeVariant类,它对VARIANT数据类型进行了封装,这意味着在所有使用VARIANT的地方都可以使用ColeVariant类的对象。在操作日期和货币变量时,Visual C++又提供了两个类:ColeCurrency和ColeDateTime,具体的内容,读者可以参考MSDN。

  本实例的代码演示了如何操作Word2000实现自动化,由于我们主要是为了辅助解释说明Visual C++编程中怎样实现自动化,帮助读者对自动化的实现过程有一个感性的认识,所以为了简单起见,该程序的功能是仅仅选择一个Word2000的*.Doc文档,并将它的内容都在该程序的"视"中显示出来。为了达到这个目的,就需要启动Word2000打开用户所选择的文件,进行全选和剪贴板操作,然后将数据粘贴到"视"中。

  在这个例子的具体实现中,我们的应用程序为自动化的客户端,Word2000为自动化的服务器端。首先生成一个新的单文档应用程序,视的基类选择CEditView,由于Office中的许多操作是由VBA语言来实现的,所以我们在使用自动化操作Word2000的过程中,为了清楚Word2000的工作过程,我们要对VBA有所了解,这些知识可以通过在Word中录制宏来实现。录制宏的步骤如下:启动Word2000,选择工具菜单下的录制宏子菜单,为一个新的宏起个名字为Macro1,开始录制宏,这时候窗口出现一个浮动工具条,点击上面的按钮可以停止或暂停宏的录制。下面是实现打开一个Word2000文档、全部选择文档内容并将数据存放到剪贴板上的操作的宏代码:


‘ Sub Macro1()
” 宏在 02-5-1 由 LiuTao 录制

Documents.Open FileName:="基于Visual C.doc", ConfirmConversions:=False, _
ReadOnly:=False, AddToRecentFiles:=False, PasswordDocument:="", _
PasswordTemplate:="", Revert:=False, WritePasswordDocument:="", _
WritePasswordTemplate:="", Format:=wdOpenFormatAuto
Selection.WholeStory
Selection.Copy
End Sub


  查看宏代码可以点击Word2000中工具菜单下的Visual Basic 编辑器。从上面的代码中可以看出对Word2000的这几个操作用到了Documents、Selection这两个自动化服务器端显示出来的对象和它们的方法。

  为了在Visual C++中编程操作Word2000,需要使用微软提供的类型库,这个类型库可以在Msword9.olb文件中找到,Msword9.olb这个文件通常情况下位于Microsoft Office的安装目录下面。利用Visual C++中的Class Wizard可以方便的向应用程序添加新的类型库,在应用程序的项目代码中启动Class Wizard ,选择Add class…. \From a type library …\C:\OFFICE\msword 9.olb,在弹出的对话框中选择_Application,_Documents,Selection,这样就可以为客户端程序中使用到的每个Word2000对象建立相应的C++类。这些类的定义和实现分别在msword9.h和msword9.cpp文件中给出。

  为了使生成程序的项目代码支持自动化,我们需要要在项目中的StdAfx.h的文件末尾添加上下面一行:#include "afxdisp.h";在应用程序的InitInstance函数的开始添加下面的调用:


if (CoInitialize(NULL)!=0)
{
 AfxMessageBox("初始化COM支持库失败!");
 exit(1);
}

 

或者加入这句话也可以:AfxOleInit();
  在操作Word2000的过程中,首先通过ColeDispatchDriver类的成员函数CreateDispatch()创建一个Word2000的Applicaion对象,然后通过COleDispatchDriver的成员函数AttachDispatch()将Documents和Selection对象与Application对象提供的IDispatch接口关联起来,在程序对上述对象使用完毕后,要使用COleDispatchDriver的成员函数ReleaseDispatch()来释放对象和接口之间的连接。

  二、编程步骤

  1、 启动Visual C++6.0,生成一个单文档的应用程序,视图的基类选择CEditView类,将该程序命名为"OperateWord";

  2、 启动Word2000,根据所要执行的Word操作录制宏;

  3、 使用Class Wizard为应用程序的项目代码中添加操作Word2000的类型库Msword9.olb;

  4、 添加代码,编译运行程序。


三、程序代码

////////////////////////////////////////////////////////////////////////////
void COperateWordView::OnShowDoc()
{
 // TODO: Add your command handler code here
 static char BASED_CODE szFilter[]="Word Files(*doc)|*.DOC||";
 CFileDialog fd(true,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter,NULL);
 CString strFilePath;//用来保存打开的文件名;
 if(fd.DoModal()==IDOK)
  strFilePath=fd.GetPathName();//获取要打开的Word文档的名字;
  _Application m_App;//定义Word提供的应用程序对象;
 Documents m_Docs;//定义Word提供的文档对象;
 Selection m_Sel;//定义Word提供的选择对象;
 m_Docs.ReleaseDispatch();
 m_Sel.ReleaseDispatch();
 m_App.m_bAutoRelease=true;
 if(!m_App.CreateDispatch("Word.Application"))
 {
  AfxMessageBox("创建Word2000服务失败!");
  exit(1);
 }
 //下面是定义VARIANT变量;
 COleVariant varFilePath(strFilePath);
 COleVariant varstrNull("");
 COleVariant varZero((short)0);
 COleVariant varTrue(short(1),VT_BOOL);
 COleVariant varFalse(short(0),VT_BOOL);
 m_Docs.AttachDispatch(m_App.GetDocuments());
 //将Documents类对象m_Docs和Idispatch接口关联起来;
 m_Docs.Open(varFilePath,varFalse,varFalse,varFalse,
  varstrNull,varstrNull,varFalse,varstrNull,
  varstrNull,varTrue,varTrue,varTrue);
 //打开Word文档;
 m_Sel.AttachDispatch(m_App.GetSelection());
 //将Selection类对象m_Sel和Idispatch接口关联起来;
 m_Sel.WholeStory ();//选择文档中的全部内容;
 m_Sel.Copy();//将数据拷贝到剪贴板
 this->GetEditCtrl( ).Paste ();//将数据粘贴到程序的"视"中;
 m_Docs.ReleaseDispatch();//断开关联;
 m_Sel.ReleaseDispatch();
}


  四、小结

  本实例主要讲述了基于自动化的技术如何操作Word2000,为读者学习自动化客户端程序的开发起到抛砖引玉的作用,读者可以在此基础上,实现对Word2000、Excel2000、PowerPoint2000等服务器端进行更复杂的操作。最后补充一句,如果读者朋友想操作OFFICE98版本的应用程序,只需要引入微软提供的8.0版本的类型库就可以了。

2006年06月11日

《侠胆雄狮》是90年5月在北京播出的,该剧片头的旁白配音太优美了:
    这是个有权有势的人统治的世界,是她的世界;
    与我的世界截然不同。
    她的名字叫,凯瑟琳。
    从我见到她的那刻起,
    她的美貌、热情和勇气就征服了我的心!
    当时我就意识到,
    她将从此改变,我的生活。
  
  
  凯瑟琳(徐燕配音):
  
  
    他来自一个神秘的地方,
    在陌生人前,他遮住自己的脸。
    以免受到仇视和伤害。
    为了抢救我的生命,他把我带到那里。
    如今,我无论走到那儿,
    心灵上总有他在伴随。
    我们的关系比友谊或爱情更为牢固。
    我们虽然不能生活在一起
    我们永远、永远也不会分离!!

  今天无意中发现《侠胆雄狮》的flash,不禁勾起了许多已模糊的回忆,依稀记起在那阴暗的下水道里狮人高大的身躯和落寞的表情,还有那开场时文森特的独白……
  

[full Screen]   
  
  凯瑟林的扮演者林达 海米尔顿后来扮演过《终结者1,2》,林达 海米尔顿本人的声音和《侠胆雄狮》配音非常相似!记得02年正大综艺十周年,好像还专门请来了他们!

 

文森特:
this is where the weatlthy and powerful live
it is her world ,all apart from mine
her name is catherine
for the moment i saw her she’ve captured my heart
with her beauty her warmness and her courage
i knew then as i know now
she would change my life forever
  这是个有权有势的人统治的世界,是她的世界;
  与我的世界截然不同。
  她的名字叫,凯瑟琳。
  从我见到她的那刻起,
  她的美貌、热情和勇气就征服了我的心!
  当时我就意识到,
  她将从此改变,我的生活。
凯瑟琳:
he comes from a secret place
far bellow the city steets
hiding his face frome the stangers safe from hate and harm
he brought me there to save my life
and now wherever i go he is with me in spirit
for we bound stronger than friendship or love
and although we can not be together
we will never ,ever be apart
  他来自一个神秘的地方,
  在陌生人前,他遮住自己的脸。
  以免受到仇视和伤害。
  为了抢救我的生命,他把我带到那里。
  如今,我无论走到那儿,
  心灵上总有他在伴随。
  我们的关系比友谊或爱情更为牢固。
  我们虽然不能生活在一起
  我们永远、永远也不会分离!!

2006年06月09日

唐璧扯谈之五十七 “国情”是个筐 啥菜都能装

  工、农、中、建、交五大银行6月1日起开征跨行查询费了,民众很是不爽,舆论也推波助澜。

  咳,不就是每笔收区区3毛钱嘛!犯得着吗?算笔帐吧。设每户每月查询一次,0.30元,每年只需3.60元。即使每月查询二到三次,每年的支出也就在10元上下。对正处于经济腾飞的中国来说,大部分家庭应该不会感到对生活有太大影响吧?

  之所以对此事这么平心静气,是因为在咱们国家,不合理收费见的实在不老少,骂的也骂过了,收的照收不误,大家不照样过来了?难道银行开征跨行查询费会成为压死骆驼的最后一根稻草?

  几十年前,民间有句顺口溜:国民党税多,GCD会多。如今看来,税多没啥大不了的,你可曾见到因为苛捐杂税多了,影响了我们的GDP节节攀升了?影响了我们综合国力的提升了?影响了中华民族的崛起了?

  有人指责银行推出此项新规前未进行听证。这年头,竟然还有人相信听证,真是I服了YOU了!唐璧都懒得谆谆教诲你了。

  近日更有全国人大代表、广东省惠州市环保局副局长黄细花向全国人大常委会提出紧急建议,要求国家价格主管部门暂时叫停跨行查询收费。黄局长真够迂的,不明白他(她)怎么当上的局级干部!银行此次收费,全国人民都早知道了,全国人大常委会会不知道?国家发改委会不知道?银监会会不知道?如果有啥问题,人家早说“NO”了,要你皇帝不急急死太监?

  黄局长在建议中还要求银行方面解释此次收费的细节,“比如银行跨行查询的成本是怎么核算的?收费具体幅度又是怎样界定的?收取的款项准备怎么使用等?”真不知怎么说黄局长好了!你说的那些个细节,银行方面会闹得清?它愿意去闹清?省省吧!早有人披露,原来准备收2毛的,可中国银联、发卡行、受理行三家没法分,索性收3毛,各拿1毛,分赃完毕,皆大欢喜。“成本”就是这样算出来的。庄子在《盗亦有道》中早就说过“分均,仁也”,银行方面没有因为分赃不均打破头,已经是仁义之“行”了,你还想咋的?至于“收取的款项准备怎么使用?”切,这种问题都问得出口!嘿,看帖的,谁有了钱不会化请举手!。

  开始怎么也闹不明白,中国老百姓啥没经历过,多如牛毛的不合理收费海了去了,多收你3毛钱,至于群情激愤,哇哇大叫吗?经过认真仔细科学缜密的分析,终于发现问题出在银行方面对此的解释上。

  据银行方面称,收费的最主要依据是“国际惯例”。就是这“国际惯例说”把老百姓惹得火腾地往上窜:手机双向收费,你咋不说“国际惯例”呢?中国电信收了几十年“月租费”、通话时间论“分”算而不是按“秒”计,你咋不说“国际惯例”呢?中小学生“享受”付费的“义务教育”,你咋不说“国际惯例”呢?老百姓一个感冒就被宰得心痛不已,一生大病就返贫,你咋不说“国际惯例”呢……

  更有好事者赶紧去一查,发现所谓的跨行查询收费的“国际惯例”也颇为可疑,实际上人家也是有收的有不收的,似乎还是不收的多些。

  银行方面的解释显然欠考虑。即使跨行查询收费确为“国际惯例”,我们也不见得就必须得“国际”了。记住,“国际惯例说”是把双刃剑,不是啥时候都可以拔出来比划的。

  唐璧在此愿意免费给那些有类似难言之隐难以启齿的人传授一个以不变应万变的绝招,曰“国情论”。

  不记得是谁说过:世界上没有两片完全相同的雪花。同样世上也不存在两个完全一样的人,同理推论,得出“地球上不可能有两个一模一样的国家,即世上所有的国家都有不同的国情”的结论决无半点牵强。

  所以,跟“国际惯例说”相比,“国情论”好使多了,称得上是无往而不胜。

  手机为啥双向收费?国情啊!中国电信为啥收你“月租费”、通话时间论“分”算?国情啊!中小学为啥要收费?国情啊!老百姓为啥一生大病就返贫?国情啊!……这不就结了!哪来那么多“为什么”的追问?这叫一了百了,没任何后遗症。

  拿唐璧议论过的中国为何不能走“西方式民主”之路来说吧!唐璧曾举地理位置上、文化传统上都是典型的东方国家的日本为例,问为什么它可以,回答是日本的“国情”决定的。如果再问,97之前的香港为何可以,不用说,是香港的“地情”决定的嘛!

  如果有人问,MKS主义在他自己的“本土”——西方国家为何没法推行?答曰:不符合它们的国情嘛!再问,在东欧(波兰、捷克、保加利亚、南斯拉夫、罗马尼亚、阿尔巴尼亚,还包括原东德)及苏联为何得而复失?回答是:还是国情决定的啊!再再问,为何在远隔千山万水、老马当时可能还不怎么了解的中国就可以呢?要知道,对中国来说,MKS主义可是地地道道的“西方思想”啊!回答曰:国情决定了就我们最合适。仍然是的“国情论”。

  这叫咬定青山不放松,以不变应万变,万变不离其宗。由此可见,“国情”是个筐,啥菜都能装。

  银行方面请听好了,今后如果要收取电话银行手续费、网上银行查询费、短消息通知费,以及个人“大额取款”、“零钞清点”费,或针对所有用户的帐户管理费等等,千万记住,就把一切都推在“国情”身上。

  上海银监局有关负责人表示,“银行收取跨行查询手续费符合有关法规的规定。……但收费的同时服务效率一定要跟上。”瞧瞧,人家那叫水平,先给你一棒子:告诉你,银行这项收费是合法的,你闹啥闹?然后再板着脸教训一下银行:可得把服务质量给我提高喽!得,各打五十大板,两不亏欠。反正,查询手续费是真金白银地收入囊中了,可以量化的;提高服务质量,本来就难以界定,它提高没提高,服务好不好,拿什么评判?谁来评判?

  这就叫滴水不漏。

  “国情论”就有滴水不漏之功。