孙鑫老师VC笔记 下载本文

内容发布更新时间 : 2024/5/19 6:51:44星期一 下面是文章的全部内容请认真阅读。

CloseHandle(hMailslot); return; }

MessageBox(buf); CloseHandle(hMailslot); }

c.加工程MailSlotCLT,加菜单“发送数据” d.加消息响应,添加代码,客户端也比较简单。

void CMailslotCltView::OnMailslotSend() 菜单“发送数据”的代码 {

// TOD Add your command handler code here HANDLE hMailslot;

hMailslot=CreateFile(\

FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(INVALID_HANDLE_VALUE==hMailslot) {

MessageBox(\打开油槽失败!\return; }

char buf[]=\DWORD dwWrite;

if(!WriteFile(hMailslot,buf,strlen(buf)+1,&dwWrite,NULL)) {

MessageBox(\写入数据失败!\CloseHandle(hMailslot); return; }

CloseHandle(hMailslot); }

5.以上4种方法各有优缺点:剪贴板比较简单。邮槽是基于广播的,可以一对多发送。但只能一个发送,一个接收,要想同时发送接收,须写两次代码。 命名管道和邮槽可以进行网络通信。

第18课 ActiveX编程(下面X均为ActiveX简称)

1.在VB中调用X控件,添加方法 project->Add components。另外可以用Object Browser来查看控件

2.在VC中创建X控件

1.新建一个X工程名为Clock,注意一个文件中可以包含多个控件。

2.保持缺省设置,完成。注意它生成的三个类,以及相关的接口。 3.运行它。选择TSTCON32.exe作为容器。

4.选择Insert Control,此时我们可以看到,它画了一个椭圆。也可以在VB中测试。 5.删除注册信息。用regsvr32 /u +文件名。也可以在菜单选择反注册命令。

6.重写代码。在CClockCtrl::OnDraw()中画了一个椭圆,此时我们在其中得到系统时间,并显示它。为此我们在OnCreate()设置了一个定时器,每隔一定时间发出一个Invalidate()消息,使窗口重绘。

7.如何改变控件的背景色和前景色?ClassWizard->AutoMation->Add Property->BackColor,还需要在OnDraw()中加上相应的代码

CBrush brush(TranslateColor(GetBackColor())); pdc->FillRect(rcBounds, &brush); pdc->SetBkMode(TRANSPARENT);

pdc->SetTextColor(TranslateColor(GetForeColor())); 8.增加属性页。在

BEGIN_PROPPAGEIDS(CClockCtrl, 2)此时数目也得改成相应的数目 PROPPAGEID(CClockPropPage::guid) PROPPAGEID(CLSID_CColorPropPage) END_PROPPAGEIDS(CClockCtrl) OK~

9.增加自定义属性:ClassWizard->AutoMation->Add Property加上一个变量m_interval,类型为short,对应外部变量为Interval。在CClockCtrl中增加OnIntervalChanged方法。添加如下代码: if(m_interval<0 || m_interval>6000) {

m_interval=1000; } else {

m_interval=m_interval/1000*1000; KillTimer(1);

SetTimer(1,m_interval,NULL); BoundPropertyChanged(0x1); }

10.测试:Control->Invoke Methods

11.将时间间隔加到属性页中,在资源视图中加入一文本框和编辑框。为EditBox关联成员变量,加入属性interval。

12.增加方法:ClassWizard->AutoMation->Add Method->Hello加入代码 OK!在VB中可以调用此方法!

void CClockCtrl::Hello() {

// TOD Add your dispatch handler code here MessageBox(\world!\}

13.增加事件:ClassWizard->AutoMation->Add Events->Click

14.增加自定义事件:ClassWizard->AutoMation->Add Events->NewMinute 在新的一分钟到达时发出这个通知,在OnDraw()中写代码: CTime time=CTime::GetCurrentTime(); if(0==time.GetSecond()) {

FireNewMinute(); }

15.让Interval属性具有持久性。在CClockCtrl::DoPropExchange()中调用PX_short()方法,OK! PX_Short(pPX,\

16.让Property Page和Property属性中的interval保持一致的方法:在OnIntervalChanged()中调用BoundPropertyChanged(0x1);

17.希望控件在设计时间内不走动的方法:在OnTimer()中, if(AmbientUserMode())InvalidateControl();巧妙! 3.在VC中调用X控件

1.新建ClockTest对话框应用程序 2.点击右键->插入X控件->时钟控件

3.Project->Add Component会生成CClock类。

4.在CCLockTestDlg中增加CClock类的成员变量m_clock,然后可以动态创建一个这样的东东! 5.试验Click(),NewMinute(),SetBkColor(),SetForeColor()方法和属性

6.如何为动态创建的控件做事件响应呢?首先你得知道它的ID号,然后参考非动态的控件事件代码,呵。

第19课 DLL编程

1.DLL简介,动态库,静态库。动态库节约磁盘空间,静态库体积大。可以用多种语言编写DLL文件。动态库有两种加载方式:隐式调用和动态加裁!

2.新建一个DLL1的dll工程,加入一源文件名为dll1.cpp,加入add和subtract两个函数,注意此时须在函数名前加_declspec(dllexport),并且编译。用dumpbi -exports dll1.dll查看其导出的函数,发现函数名字已经被改成了 ?add@@YAHHH@Z,这种现象叫做名字粉碎,是为了支持函数重载而做的。

3.编写一个程序测试DLL,工程名为DllTest,基于对话框的,放置两个按纽add和subtract,响应按纽消息,调用这个Dll的add和subtract函数。使用这两个函数前要先声明函数,//extern int add(int a,int b);

//extern int subtract(int a,int b);

还需要将Dll1.lib和Dll1.dll拷贝到当前目录下!另外还需要在Project->Setting->Link->Object/Library中加入Dll1.lib,此种方式为隐式调用!OK!用Dumpbin -imports DllTest.exe查看它的输入信息,可以看到它加载了dll1.dll。同时也可以用depends程序查看程序需要哪些dll文件!除了用extern外,还可以用//_declspec(dllimport) int add(int a,int b); //_declspec(dllimport) int subtract(int a,int b);

告诉编译器,此函数是动态链接库中的函数,这样可以提高效率。

4.通常写Dll时在dll1.h中声明函数,然后在DllTest.h中包含这个头文件,另外会用一组宏来取代_declspec(dllimport) Dll1.h

#ifdef DLL1_API #else

#define DLL1_API extern \_declspec(dllimport) #endif

DLL1_API int _stdcall add(int a,int b); DLL1_API int _stdcall subtract(int a,int b); Dll1.cpp的代码:

#define DLL1_API extern \_declspec(dllexport) #i nclude \#i nclude #i nclude int _stdcall add(int a,int b) {

return a+b; }

int _stdcall subtract(int a,int b) {

return a-b; }

5.在Dll1中加入类Point它有一个函数output(int a,intb),它的功能是在屏幕上输出x,y值。须包含头文件windows.h和stdio.h.然后在DllTest中加入一个按纽来测试这个函数!此时我们可以dumpbin来查看dll1.dll和dllTest.exe的导出导入情况。注意,也可以只导出类的某个函数。 6.我们希望导出的函数名不被改变,加extern \大写的C!即可,#define DLL1_API extern \_declspec(dllexport),但它只能导出全局函数,不能导出类的成员函数,并且如果调用约定被改成了别的方式,此时函数名也被改变。所以这种方式不太好。 7.解决之道是用模块定义文件。 1.新建dll2.dll工程;

2.加dll2.cpp中写两个函数add和subtract 3.在目录中新建dll2.def文件,增加到工程。

4.在dll2.def中加入如下代码: LIBRARY Dll2 EXPORTS add subtract

5.编译后用dumpbin查看函数名是否被改变?

6.测试,我们这次用动态加载的方法来调用dll文件。以前是用隐式链接的方法,嘿嘿。动态加载的好处是需要时再加载,可以提高执行的效率。代码如下: HINSTANCE hInst; hInst=LoadLibrary(\

typedef int (/*_stdcall*/ *ADDPROC)(int a,int b);

//ADDPROC Add=(ADDPROC)GetProcAddress(hInst,\ADDPROC Add=(ADDPROC)GetProcAddress(hInst,MAKEINTRESOURCE(1)); if(!Add) {

MessageBox(\获取函数地址失败!\return; }

CString str;

str.Format(\MessageBox(str); FreeLibrary(hInst);

7.此时你改变调用约定,函数名不会被改变,但如果你加上_stdcall定义函数,调用时也需要加入_stdcall,否则会出错!

8.DllMain()是Dll的入口点,不过不是必须的。但在DllMain中不要做复杂的调用。为什么?因为DllMain加载时,某些核心Dll文件不一定已经被加载。 9.创建一个基于MFC的DLL工程,简介。

10.当不使用DLL时,调用FreeLibrary减少DLL的使用计数,释放DLL资源,减少系统负担。明白?

11.上面总结:1.*.def使函数名不改变; 2.定义时为_stdcall,调用时也必须用_stdcall.

第20课 钩子与数据库编程

1.Hook简介:作用是拦截某些消息,关键函数是SetWindowsHookEX() 2.示例程序:

1.新建一基于对话框工程,InnerHook,此过程的钩子是只拦截本进程的。 2.在OnInitDialog()中添加代码: