C++ Rundll32加载顺序问题

C++ Rundll32加载顺序问题,c++,deployment,C++,Deployment,我的产品由两个dll组成(为了清楚起见,A.dll和B.dll),A.dll依赖于B.dll。A和B DLL都在同一个文件夹中(例如c:\app)。同时,旧版本的B.dll位于Windows\System32文件夹中。当我尝试从命令提示符运行以下命令时(当前文件夹为c:\app): rundll32.exe“c:\app\A.dll”,DoWork 我收到错误,因为rundll32使用System32文件夹中旧版本的B.dll。我试图使用.dll库的DllMain函数中的SetDllDirect

我的产品由两个dll组成(为了清楚起见,A.dll和B.dll),A.dll依赖于B.dll。A和B DLL都在同一个文件夹中(例如c:\app)。同时,旧版本的B.dll位于Windows\System32文件夹中。当我尝试从命令提示符运行以下命令时(当前文件夹为c:\app):

rundll32.exe“c:\app\A.dll”,DoWork

我收到错误,因为rundll32使用System32文件夹中旧版本的B.dll。我试图使用.dll库的DllMain函数中的SetDllDirectory API将c:\app文件夹添加到搜索路径,但对我无效。
我找不到任何关于rundll32内部结构的有用且完整的信息,也找不到任何关于dll加载顺序的信息。

是否可以在此部署配置中成功执行rundll32?(我的意思是从c:\app文件夹加载新的B.dll版本)。

我会去掉旧的dll,或者为新的dll使用另一个名称。有两个版本的东西应该做相同的事情,并给它起相同的名字,很可能会造成严重破坏。

DLL等等
嗯,从复古的角度来说,它有点酷。这里有一个想法:尝试将rundll32.exe复制到与新dll和您的产品相同的文件夹中,然后从那里运行它。它可能会工作…

DLL的全部要点是您可以有一个默认的DLL。然后,随着较新版本的发布,您使用相同的名称,以便旧代码选择较新版本。但是如果存在不兼容,您仍然可以使用旧的。不幸的是,它导致了一系列被称为“DLL地狱”的问题——确切地说,这就是DLL地狱。dll是无法重命名的旧组件。是的,它可以工作。但在我看来,这是一个太沉重的解决方案。如果我可以从其原始文件夹执行rundll32.exe,那就太好了。另外一个缺点是:当下一个SP被释放并且System32\rundll32.exe被更新时,您的副本将过时,并且可能以许多“有趣的”方式失败。我希望病毒扫描者也会认为它是可疑的。看来我找到了解决办法。我在A.dll项目中的链接器选项中添加了/DELAYLOAD:“B.dll”开关。在这之后,setdlldicrectoryapi开始工作,rundll32从c:\app文件夹加载新版本的B.dll。谢谢大家!
rundll32.exe "c:\app\A.dll",DoWork