VC++深入详解笔记之杂项

1.ShellExecute( NULL, _T("open"), _T("www.youkuaiyun.com"), NULL, NULL, SW_SHOWNORMAL);打开网页




2.直接在代码中添加还是报错


经过多次试验,我已经知道咋个添了


类型是:int [4]


名字是:a


3.今天在用VS2005的时候,突然加载了张ico,resource view不能打开,如题。。。


折腾了半天,发现把全部的cpp窗口关闭就行了。。。。


记录下,成果。。。。
4.在Windows中,所有的消息都是用一个特定的整数值来表示的,为了避免我们自定义的这条消息与其他已有消息值发生冲突,应该利用windows提供的一个常量:WM_USER。小于这个常量的值都是windows系统保留的,我们自定义的消息只需要大于这个值就可以了。于是在自定义消息时,通常都是用WM_USER加上一个数值,这个值可由编程人员自行决定。


5.最好将自定义消息声明形式为 afxmsg LRESULT OnFunction( WPARAM wParam , LPARAM lParam)不然都不知道自己怎么死得




6.如何自定义消息及相应的响应函数:
①在[架构类]的头文件中定义消息 #define UM_PROGRESS WM_USER + 1
②在类的声明中添加消息响应函数的声明 afx_msg LRESULT OnProgress(WPARAM wParam , LPARAM lParm);
③在BEGIN_MESSAGE_MAP宏后面添加响应的消息映射:ON_MESSAGE(WM_PROGRESS,OnProgress)
④实现消息响应函数OnProgress
⑤在需要调用消息响应函数的地方调用SendMessage(UM_PROGRESS)或PostMessage(UM_PROGRESS)
注:SendMessage函数发送消息的机制是直接把消息发送给消息响应函数,由消息响应函数处理完成以后,SendMessage函数才返回。而PostMessage函数是把消息放在消息队列中,然后立即返回,之后程序通过GetMessage函数按顺序把消息一条一条的取出来。




const的用法,此乃C++的内容:
虽然const我仔细琢磨一下都能弄对,但经常被它的咋先搞得很头疼,因为每次看到const我都必须停下来多花点时间琢磨一下,才能确定自己的判断。现在有个方法了,^_^
在形如 char * p = ch;中要放置const只有三个地方
①char前面②char和*中间,③*和p中间④ char * p const = ch[如果你这么写也没有关系,因为编译器会告诉你,这是个错误]
第①种情况和第③种情况都很好判断,关键是第②种,形如: char const * p = ch;
这时候const 是指指向的值不能修改呢,还是指针不能修改?很简单,const和数据类型char而不是指针标示*亲近【记住这句话就够了】,也就是说const尽可能控制char,实在没有办法了(char * const p = ch)才控制*号。这就说明第②种情况其实是和第①种情况一样的。以上皆是主人公,也就是我啦,亲自验证,准确无误。


可以重载LPCRECT?这不是一个数据类型吗?


组框只起标示作用,如果对其有操作,就需要修改其ID


第十九章DLL
为了让DLL到处一些函数,需要在每一个将要被到处的函数前面添加标示符: _declspec(dllexport)


加载动态链接库的时候需要lib和dll文件。并在项目设置中加入lib文件


除了使用extern关键字表明函数是外部定义的之外,还可以使用标识符:_declspec(dllimport)来表明函数是从动态链接库中引入的。
将自己写的代码编译成一个dll文件,然后提供一个头文件给客户。
头文件形如:
#ifdef DLL1_API
#else
#define DLL1_API _declspec(dllimport)
#endif


DLL1_API int add(int a, int b);
DLL1_API int sub(int a, int b);


GetForegroundWindow函数将返回前景窗口的句柄。


导出类:
class /*DLL1_API*/ Point //可以导出整个类或部分函数
{
public:
void DLL1_API output( int x, int y);
void test();
}


利用限定符:extern "C"可以解决C++和C语言之间相互调用时函数命名的问题,但是这种方法有一个缺陷,就是不能用于导出一个类的成员函数,只能用于导出全局函数。


动态加载链接库:
HMODULE LoadLibrary( LPCTSTR lpFileName);//lpFileName即要加载的模块名称
FARPROC GetProcAddress( HMODULE hModule, LPCTSTR lpProcName);//模块加载成功后,用此函数获取函数地址
BOOL FreeLibrary( HMODULE hModule);
如果采用动态加载方式使用DLL时,在需要访问时,调用LoadLibary函数加载该DLL;当不再需要访问该DLL时,调用FreeLibrary函数释放该DLL的引用。


动态加载链接库就不需要lib文件了,使用形如:
void CDllTestDlg::OnBtnAdd()
{

HINSTANCE hInst;
hInst = LoadLibrary("Dll2.dll");
typedef int (/*_stdcall*/ *ADDPROC)(int a, int b);
ADDPROC add = (ADDPROC)GetProcAddress( hInst , "add" );


if( !add)
{
MessageBox("获取函数地址失败");
return;
}
CString str;
str.Format("5+3=%d", add(5,3));
MessageBox(str);
}
当DLL中导出函数采用的是标准调用约定时,访问该DLL的客户端程序也采用该调用约定类型来访问相应的导出函数。
对于可执行模块来说,其入口函数是WinMain。而对于DLL来说,其入口函数是DllMain,但该函数是可选的。也就是说,在编写DLL程序时,可以提供也可以不提供DllMain函数。
BOOL WINAPI AllMain(
HINSTANCE hinstDLL,
DWORD fdwReason,
lpVOID lpvReserved);




HOOK
SetWindowsHookEx安装一个应用程序定义的钩子过程,并将其放到钩子链中。最后安装的钩子过程总是排列在该链的前面。
安装鼠标钩子:
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam);
在钩子过程总对信息处理完成之后,如果想把信息继续传递给下一个钩子过程,可以调用CallNextHookEx函数来实现。该函数的功能是把钩子信息传递给豆子链中下一个等待接收信息的钩子过程。如果钩子过程对当前消息进行了处理,则应返回一个非0值,以避免系统再次将此消息传递给目标窗口过程;
LRESULT CallNextHookEx(HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam);
移走一个已安装的钩子:
BOOL UnhookWindowsHookEx(HHOOK hhk);

如果想要屏蔽当前正在运行的所有进程的鼠标消息和键盘消息,那么安装钩子过程的代码必须放在动态链接库中去实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值