调用DLL分动态调用和静态调用两种.通过实验,确定Dll是从哪个全路径进行装载.
在exe和ocx的当前路径放上A.dll, <WinDir>和<Win32SystemDir>下放上放上A.dll, A.dll.
这3个Dll有同样的接口void test(), 弹出的msg不同.
测试分3种情况:
1.用exe调用test(),
2.用exe包容ocx调用test(),
3.用静态网页调用test()
<2011_0110>
工程和实验完成
1. 先生成同名同接口的3个Dll, 分别拷贝到Exe同级目录, Windows目录, Windows/System32目录 Dll中的方法WhereAreYou(), 报告Dll所在的位置. 2.1 在Dll的同级目录运行exe, 报告Dll在同级目录. 2.2 在一个没有Dll的目录中运行exe, 报告Dll在Windows/System32目录中. 2.3 删除System32目录中的Dll, 在一个没有Dll的目录中运行exe, 报告Dll在Windows目录中. 实验结果1得出: 由exe动态和静态调用Dll的路径搜索顺序为'exe同级目录'=>'Windows/System32/'=>'Windows' 3.1 当注册的控件和Dll同级目录时, 静态测试网页在单独的目录, ocx动态和静态调用Dll, 都报告Dll在Ocx同级目录 3.2 当注册的控件单独在一个目录时, 静态测试网页在单独的目录, ocx动态和静态调用Dll, 都报告Dll在Windows/System32/目录 3.3 删除System32目录中的Dll, 当注册的控件单独在一个目录时, 静态测试网页在单独的目录, ocx动态和静态调用Dll, 都报告Dll在Windows/ 目录 实验结果2得出: 由静态网页中的Ocx动态和静态调用Dll的路径搜索顺序为'exe同级目录'=>'Windows/System32/'=>'Windows'与exe相同 4. 调用Ocx的网页为Web服务器端的网页时的调用情况, 网页服务器用Apache搭建, 测试网页放在tomcat的webapps/ROOT目录 4.1 Ocx注册时和Dll同级, 通过ocx调用Dll后, ocx动态和静态调用Dll, 都报告Dll在安装目录(和Ocx同级的目录) 4.2 Ocx注册时单独在一个目录, 通过ocx调用Dll后, ocx动态和静态调用Dll, 都报告Dll在Windows/System32目录 4.3 Ocx注册时单独在一个目录, 删除了System32下的Dll, ocx动态和静态调用Dll, 都报告Dll在Windows目录 实验结果3得出: 当静态网页在服务器端运行时, Ocx动态和静态调用Dll的路径搜索顺序为'exe同级目录'=>'Windows/System32/'=>'Windows'与 exe相同 5. 独自放置的Ocx, 删除Windows/System32下的Dll和Windows/下的Dll再运行服务器端的测试网页 5.1 控件不能注册成功, 原因: 静态依赖的Dll不存在. 5.2 网页中的控件已经无法成功装载, 因为Ocx依赖的Dll不存在 实验总结: 动态调用Dll和静态调用Dll, 对于exe和Ocx是相同的, 对于本地运行的网页和服务器端运行的网页也是相同的. Dll的路径搜索顺序为'exe同级目录'=>'Windows/System32/'=>'Windows' 实验备注: 1. 制作安装程序时, 把Ocx, exe, dll都拷贝到一个安装目录中, 是稳妥的. 这样做, 即使系统中有其他不同版本的同名Dll散在Windows目录或Windows/system32目录中也不要紧, 只要注册的控件和依赖的Dll都在一个目 录中, 软件就能稳定运行. 2. 把本次安装的软件拷贝到系统目录中不好的地方是: 如果有用到那个同名Dll的程序在运行, 安装程序根本更换不掉那个同名Dll, 为失败打 下了基础. LostSpeed 2011_0110_2319
实验工程下载点: http://download.csdn.net/source/2974925
今天看到资料说, 搜索路径为 current dir => system32 dir => win dir => path 环境变量指定的路径.