C++ 如何重新分发同时包含32位DLL和64位DLL的软件?

C++ 如何重新分发同时包含32位DLL和64位DLL的软件?,c++,windows,dll,npcap,C++,Windows,Dll,Npcap,我正在开发NPcap,这是一款开源的Windows数据包捕获软件,源于著名的WinPcap,并通过更多功能进行了增强 WinPcap的核心文件是wpcap.dll、packet.dll(在System32和SysWOW64中)和名为npf.sys的驱动程序。与WinPcap稍有不同,我们的NPcap将提供NPcap.dll、wpcap.dll、packet.dll和驱动程序NPcap.sys。npcap.dll是我们的npcap的“wpcap.dll”,npcap.sys是我们的npcap的“n

我正在开发NPcap,这是一款开源的Windows数据包捕获软件,源于著名的WinPcap,并通过更多功能进行了增强

WinPcap的核心文件是wpcap.dll、packet.dll(在System32和SysWOW64中)和名为npf.sys的驱动程序。与WinPcap稍有不同,我们的NPcap将提供NPcap.dll、wpcap.dll、packet.dll和驱动程序NPcap.sys。npcap.dll是我们的npcap的“wpcap.dll”,npcap.sys是我们的npcap的“npf.sys”。dll是我们添加的一个包装器,以保持与原始WinPcap兼容

  • 由于我们希望NPcap与WinPcap共存,因此我们决定将NPcap.dll、wpcap.dll、packet.dll安装到软件安装路径“C:\Program Files\NPcap”中,而不是安装到System32和SysWOW64路径中

  • 我们不想更改wpcap.dll的文件名等,因为我们希望WinPcap的用户软件可以在WinPcap在系统中不可用时自动使用NPcap的dll。Windows按名称查找DLL

  • NPcap希望在64位Windows中同时支持32位和64位用户软件(如Wireshark和Nmap)。因此,32位Nmap可以使用其32位wpcap.dll,64位Wireshark可以使用其64位wpcap.dll


  • 在这里我遇到了一个问题:我们的用户软件包括nmap和Wireshark,它们可以是32位或64位。32位软件将仅使用32位DLL,64位软件将使用相同的DLL。如果我们将NPcap的wpcap.dll放入安装路径(如“C:\Program Files\NPcap”)并将此字符串添加到path环境变量中,我们无法将32位wpcap.dll和64位wpcap.dll都添加到“C:\Program Files\NPcap”中,因为它们共享相同的名称。我们希望保留“wpcap.dll”名称,因为我们需要与原始WinPcap保持兼容因此我们无法将“wpcap.dll”复制到System32和SysWOW64,因为WinPcap的wpcap.dll已经存在了还有一个问题,我们将32位DLL和64位DLL分别放在不同的目录中。如果我们将DLL分别放在“C:\Program Files\NPcap\x86”和“C:\Program Files\NPcap\x64”中。我们仍然需要将这两条路径放入系统PATH环境变量中,以便其他软件调用。这两个DLL路径将有一个顺序。后一个路径将被前一个路径覆盖,因为Windows加载程序将按DLL的文件名搜索DLL


    有没有办法不将DLL复制到System32和SysWOW64路径中,同时解决32位和64位DLL的解决问题?

    创建子目录32\和64\(或x86\和x64)还有一个问题是,我们将32位DLL和64位DLL放在不同的目录中。如果我们将DLL分别放入“C:\Program Files\NPcap\x86”和“C:\Program Files\NPcap\x64”中。我们仍然需要将这两条路径放入系统PATH环境变量中,以便其他软件调用。这两个DLL路径将有一个顺序。后一个路径将被前一个路径覆盖,因为Windows加载程序按DLL的文件名搜索DLL。WinPcap如何解决此问题?(正确的解决方案是让“其他软件”知道如何调用正确版本的DLL,最好是随它一起提供。但在您的情况下,这不起作用。)WinPcap将其DLL放入system32和syswow64。NPcap的DLL名称与WinPcap的名称相同,因此我们无法使用这些路径来包含DLL。也许您可以将路径设置为DIR/%PROCESSOR\u ARCHITECTURE%/?根据这个链接,它返回当前进程的架构。因此,它应该解析到正确的目录。