先声明一点,我是嵌入式方向的学生,因为一点需要编写MFC程序,这篇文章只是我接触MVSC++的一些个人记录。
- HINSTANCE和HWND的区别:二者都是表示句柄,前者是应用程序的句柄,后者是窗口的句柄。进程中的每个DLL模块被全局唯一的32字节的HINSTANCE句柄标识,只有在特定的进程内部有效,句柄代表了DLL模块在虚拟空间中的其实地址。在WIN32中,HINSTANCE和HMODULE的值是相同的,这两种类型可以替代使用。
- stdcall 是C++标准调用方式,WINAPI宏和CALLBACK宏来指定函数的调用方式为stdcall
- exteern “C”:为了解决C\C++的兼容问题,通用性更强。
- 应用程序调用DLL的第二种方法:(IpAddFun)GetProcAddress(hDll,MakeIntresource(1));其中MakeIntresource直接通过.def文件中为函数制定的顺序访问。MakeIntresource是一个通过序号获取函数名的宏//需要看具体的代码理解,暂未确定是这样。
- DLL程序入口函数DLLMain:注意大小写是区别的(仅导出资源的DLL可以没有DLLMain函数)。函数原型参数的意义:hMoudule参数:指定向DLL本身的实例句柄;ul_reason_for_call参数:指明了DLL被调用的原因,可以有以下4个取值:1、DLL_PROCESS_ATTACH:当DLL被进程第一次调用时,导致DLLMain函数调用,如果同一个进程后来再次调用此DLL时,操作系统只会增加DLL的使用次数。
- DLLMain函数:WINDOWS在加载DLL的时候,需要一个入口函数,就如同控制台或DOS程序需要MAIN函数、WIN32程序需要WINMAIN函数一样,WINDOWS在找不到DLLMain的时候,系统会从其他运行库中引入一个不做任何操作的缺省的DLLMain函数版本,并不意味着DLL可以放弃DLLMain函数,就像是默认的构造函数一样。DLLMain函数在DLL被加载和卸载时被调用,在单个现成的启动终止时,DLLMain函数也被调用,ul_reason_for_call指明了被调用的原因。原因有4种。
- APIENTRY定义为——stdcall,他以为着这个函数以标准Pascal的方式进行调用,也就是WINAPI方式;进程中的每个DLL模块被全局唯一的32字节的HINSTANCE和HMODULE的值是相同的,这两种类型可以替换使用,这就是函数参数hModule的来历。
- GetProcAddress(hDll,MAKEINTRESOURCE(1)),他直接通过.def文件中为add函数指定的顺序号访问add函数,MAKEINTRESOURCE是通过序号获取函数的宏。
- Dll文件的使用有两种方法:第一种:加载时动态链接:具体方法:#pragma commet(lib,”mydll.lib”) extern “c”_declspec(dllimport) int add(int a,int b);第二种:运行时动态链接:主要使用LoadLibrary和GetProcAddress,LoadLibrary返回值是HMOUDULE或HINSTANCE。
- 编译DLL文件的时候会提示无法启动程序DLL,但是DLL和LIB文件可以生成。
- PSAM卡生成过程密钥和加密数据之间若是加上PSAM卡产生随机数则会产生不响应错误。
- 产生随机数指令过程理解:压缩指令2字节变成1字节,可能压缩后返回的字符指针可与ASCLL表对应,也可能不可以与ASCLL码对应,都可以使用输出函数进行输出,没有规定的输出乱码,之后选择把没有对应ASCLL表的压缩字符再次拉伸而进行相关操作,这里(PSAM卡接口开发)需要拉伸返回的压缩指令提取字符数组表示的十六进制随机数。
- 外部认证中有一个随机数要从CPU生成,卡片默认有一个操作是使用CPU内部一个最近生成的随机数和外部认证指令里面的一个随机数,生成密钥,和由PSAM卡生成的在外部认证使用到的密钥对比,结果正确则由卡片返回9000
- 动态库的循环调用的过程中,要是循环调用的动态库都使用的是当前文件调用,则,当前文件为刚开始的调用的DLL动态库
- 做外部认证的时候,需要用到PSAM进行数据加密,要是找不到PSAM卡的密钥文件,添加一二级分散因子,同时指令的长度字节边长。