使用 Visual Studio c++ V10,我试图弄清楚如何构建 DLL 并解决 DLL 命名冲突。这是详细信息。
公司 S 运送了一个名为 M.EXE 的产品.假设M.EXE安装在 \S\BIN\M.EXE .公司 S 静态链接到名为 U.DLL 的 DLL ,安装在 \S\BIN\U.DLL 中. U.DLL包含开源代码,并使用 Visual C++ 编译器选项构建 /Zc:wchar_t- ,它不会将 wchar 识别为 native 类型。
C 公司发布了一个名为 O.DLL 的 DLL ,并发布此 DLL 的 API,并为 O.DLL 提供一个导入库.假设O.DLL安装在 \C\BIN\O.DLL . O.DLL静态链接到名为 U.DLL 的 DLL ,安装在 \C\BIN\U.DLL 中. U.DLL基于相同的开源代码构建,但使用 Visual C++ 编译器选项构建 /Zc:wchar_t ,它确实识别 wchar_t作为原生类型。
理想情况下,公司 C 和公司 S 会同意 build U.DLL使用相同的 Visual C++ 选项,但这是不可能的。
M.EXE来自公司 S 的是可扩展的,因为我可以在非托管 C++ 中构建我自己的 DLL,称之为 NODE.DLL那M.EXE如果我正确设置所有内容,将会调用。我想 build NODE.DLL以便它静态链接到 O.DLL来自C公司。但问题是一旦M.EXE正在运行,它已经加载了 U.DLL来自 \S\BIN 的图书馆,以及来自 \S\BIN\U.DLL 的符号与 \C\BIN\U.DLL 中的略有不同, 因为如何 U.DLL由每个公司 build 。所以当M.EXE尝试加载 NODE.DLL , 它失败了,因为当 NODE.DLL负载 O.DLL , 这需要 U.DLL , \C\BIN\U.DLL 中需要的符号不存在,因为 Windows 看到 U.DLL因为已经被加载了。
情况图如下:
M.EXE static link to -> \S\BIN\U.DLL
M.EXE dynamic link to -> NODE.DLL
NODE.DLL static link to O.DLL
O.DLL static link to \C\BIN\U.DLL
实际上,我同时需要 \S\BIN\U.DLL和 \C\BIN\U.DLL共存于同一个进程空间,并拥有M.EXE使用其版本 U.DLL和 O.DLL使用其版本 U.DLL .
请注意,我没有重建 M.EXE 的选项或 O.DLL改变它们各自的加载方式U.DLL .它们来自第三方,因此无法更改静态链接。我也没有使用 LoadLibrary 的选项在 O.DLL ,因为它是一个 C++ 库,提供了一个导入库。
我相信可以使用 list ,以便在我构建 NODE.DLL 时使用静态链接到 O.DLL,我在 NODE.DLL 的 list 中进行设置这样O.DLL加载自己的 U.DLL 拷贝安装在 \C\BIN\U.DLL 中.我只是不知道该怎么做。理想情况下,我不想修改 O.DLL 的 list ,但如果这是唯一的解决方案,我会接受。
最佳答案
您可以在同一进程中拥有多个具有相同文件名 的 DLL,方法是使用绝对路径加载其中的一个或多个 DLL。这确实需要动态加载 DLL,但行为在其他方面是相同的。
不是在构建过程中链接,你需要 std::string moduleName = appPath + "\s\bin\u.dll";加载模块(模块名称.c_str())。因为这对于需要加载哪个 DLL 是明确的,所以它允许您加载多个具有“相同”名称的 DLL。
加载模块后,您可以将每个必要的函数分配给函数指针,然后包装它们或使用合法但很少使用的 syntax of calling functions pointers as normal functions (funcPtr(params)).
如果您使用的是较新版本的 Windows,则可以使用 DLL list 来加强模块周围的版本控制/命名,并使 EXE 加载与通常不同的 DLL。我不熟悉这究竟是如何完成的,尽管它记录在 MSDN 上(可能也在这里)。
关于c++ - 具有相同名称的非托管 C++ DLL 在同一进程中共存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14281089/
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#
我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只