C++ 从DLL调用方法

C++ 从DLL调用方法,c++,dll,C++,Dll,在我的项目中,我们有一组现有的DLL,我希望按原样使用它们。但这将创建跨多个dll的级联调用。以下是呼叫流程: First.dll将调用Second.dll以获取已创建内存块中的信息。(内存块的指针将被传递到第二个dll以获取输出数据。) Second.dll将调用Third.dll,并将移交内存块的指针(最初由First.dll创建) 我的申请面临哪些问题?请告诉我这个建议的优点和缺点 注意:First.dll和Second.dll将是新开发的。Third.dll是现有的dll,将被重用。即使

在我的项目中,我们有一组现有的DLL,我希望按原样使用它们。但这将创建跨多个dll的级联调用。以下是呼叫流程:

  • First.dll将调用Second.dll以获取已创建内存块中的信息。(内存块的指针将被传递到第二个dll以获取输出数据。)
  • Second.dll将调用Third.dll,并将移交内存块的指针(最初由First.dll创建)
  • 我的申请面临哪些问题?请告诉我这个建议的优点和缺点

    注意:First.dll和Second.dll将是新开发的。Third.dll是现有的dll,将被重用。即使在将来,我们也可能有新开发Third.dll的场景。我想知道应用程序在多个DLL之间进行级联调用时会遇到什么问题吗?

    “如果它能工作,就不要修复它”意思是如果它们“按原样”工作,那就没事了。我想这些DLL是现有的吗?因此,是否已经设计并测试了一起工作?如果是这样,他们也会为你工作。干杯


    但是,如果您计划自己构建这些DLL,或者有一组备用的DLL,那么我建议使用一个没有级联DLL的更简单的体系结构。当周围的DLL或DLL级别较少时,调试和开发就更容易了。不过,如果您手头有一个经过测试的设置,就不要麻烦自己去做了。

    只有当您想将共享功能分离出来以便在不同的项目中使用它们时,才应该在此上下文中使用DLL。如果您只有一个程序需要从中访问功能,那么没有理由将其分离到库中

    在级联调用的情况下,您将面临比来自您自己的应用程序内部的调用更大的开销。这是因为程序集发生了更改

    下面是对类成员的正常调用的一个非常粗略的表示:

    push 0                   ; a parameter
    push 1                   ; another parameter
    push eax                 ; pointer to the class instance
    call Program.SomeMethod  ; direct call to the method
    
    这是非常快的。当您包括DLL时,您必须通过IAT执行呼叫。这会增加执行时间。同样,这是一个粗略的简化:

    push 0
    push 1
    push eax
    call <Program.IAT_1>
    ...
    Program.IAT_1:
      jmp DLL1.SomeCall
    ...
    DLL1.SomeCall:
      ; more code here
      call <DLL1.IAT_1>
    ...
    DLL1.IAT_1:
      jmp DLL2.SomeOtherCall
    ...
    DLL2.SomeOtherCall
      ; actual code here
      ret
    
    push 0
    推1
    推送eax
    呼叫
    ...
    程序.IAT_1:
    jmp DLL1.SomeCall
    ...
    DLL1.SomeCall:
    ; 这里有更多代码
    呼叫
    ...
    DLL1.IAT_1:
    jmp DLL2.SomeOtherCall
    ...
    DLL2.SomeOtherCall
    ; 这里的实际代码
    ret
    
    由于您是跨模块调用的,因此如果您频繁调用此函数,将导致很大的开销

    还有许多与维护和部署相关的问题,这使得在不必要的情况下不进行拆分更加谨慎


    在这种情况下,您应该拆分它的唯一原因是您是否计划在另一个应用程序中使用某些代码。即使在这种情况下,您也不应该需要多个DLL。

    如果它们是您不更改的现有DLL,它们不是已经以这种方式工作了吗?这个问题的重点是什么?你在考虑重构你的项目吗?您是否遇到任何问题?我已编辑了我的问题,以反映重新使用的dll和新开发的dll。刚刚发现您的更新。记住性能问题,只在需要的地方划分类。如果您只在一个应用程序中使用一个类,请将其保存在该应用程序的代码中。如果您正在构建一个重要的库,那么您共享的任何内容都应该放在一个共享DLL中,并在主要功能之间进行分隔。任何更多的都可能是过分的。啊,你更新了你的问题。DLL将为您的应用程序增加一层复杂性。开发和调试将更加困难。如果这些DLL不在其他任何地方使用,我就不会麻烦了。