WINCE不同exe通过LoadLibrary装载dll的问题

 

1.  问题描述

 

在产品测试过程中才注意到一个这样的现象,不管是C++还是用C#开发的程序在动态调用dll的时候都会存在:A.exe和B.exe都会通过LoadLibrary(_T("DeviceAPI.dll"))来把DeviceAPI.dll映射到调用进程的进程空间中。把A.exe和DeviceAPI.dl放在A文件夹下面,把B.exe和DeviceAPI.dl放在B文件夹下面,先运行A.exe,然后再运行B.exe,但发现后运行的B.exe实际上是把A文件夹而不是B文件夹下的DeviceAPI.dl映射到自己的进程空间中。

 

2.  问题分析

在MSDN中关于LoadLibrary函数描述里有这样的说明“When Windows Embedded CE loads a DLL, all path information is ignored when determining if the DLL is already loaded. This means that a DLL with the same name but a different path can only be loaded once. In addition, a module ending with the extension .cpl is treated as if the extension is .dll.”。相关链接:http://msdn.microsoft.com/en-us/library/ee488148(v=WinEmbedded.60).aspx。也就是说当WINCE检测到已经装载了一个dll(这里为DeviceAPI.dll),如果B.exe再装载同一个dll(DeviceAPI.dll),就算是B.exe在调用LoadLibrary的时候指定了dll的具体路径,WINCE也会忽略掉。这意味着不同路径下同一个名字的dll只能为WINCE系统加载一次,此为扩展名为cpl(控制面板程序)的模块被看做同名字的扩展名为dll的模块(LoadLibrary也可以加载cpl模块的)。
 

 

3.  问题避免和解决

由于WINCE系统的这个限制,让使用者肯定会存在一定的不方便性。但我们只要做到下面几点就可以避开此问题:

⑴A.exe在打开的情况下,再打开B.exe就会存在上面的问题,可以先关闭A.exe,再打开B.exe就可以避开此问题,但有些应用场合可能需要两个exe都打开。

⑵同一个dll使用不同的名字,比如A.exe装载DeviceAPIA.dll,B.exe装载DeviceAPIB.dll,但实际上他们装载的都是DeviceAPI.dll。

这些办法只是避开了此问题,但没有办法从根本上解决这些问题,知道的朋友希望分享一下,谢谢!

 

你可能感兴趣的:(WINCE不同exe通过LoadLibrary装载dll的问题)