代码之家  ›  专栏  ›  技术社区  ›  George Johnston

如何将C++方法暴露给我的C语言应用程序?

  •  2
  • George Johnston  · 技术社区  · 15 年前

    我目前正在学习VC++。我创建了一个应用程序,它具有阻止/允许IP地址的功能,我想将此功能公开给C应用程序。

    我在头文件中定义了以下成员,这些成员引用了.cpp文件中需要在应用程序外部访问的方法。

    public:
    
    // Constructor.
    ZizFilter();
    
    // Destructor.
    ~ZizFilter();
    
    BOOL StartFirewall();
    BOOL StopFirewall();
    
    BOOL AddIPAddressToBlockedList(char* IP)
    BOOL RemoveIPAddressFromBlockedList(char* IP)
    
    BOOL BlockAll(char* tunnelAddress);
    BOOL UnblockAll();
    

    我理解C语言互操作方面以及如何使用暴露的汇编方法,但我不知道如何让我的C++应用程序公开公开这些方法。

    4 回复  |  直到 6 年前
        1
  •  6
  •   morechilli    15 年前

    解决这一问题的一种方法是在C++ CLI中编写一个包装器——这是C++的扩展版本,用于管理托管的.NET项目。

    您可以在C++CLI中创建一个托管或“REF”类,该类将作为一个普通.NET类显示给C.*。

    在C++ CLI类中,可以将纯C++类调用为正常。

        2
  •  2
  •   isekaijin    11 年前

    哎呀…让我们澄清一些事情:

    1. C interop允许您像使用.NET方法一样使用经典win32 dll公开的函数。这些DLL通常用C语言编写。

    2. 您也可以在C++中编写Win32 DLL。这和用C语言编写win32 dll一样,唯一的区别是…

    3. C++编译器 mangle 函数名不同于c.name管理,它将有关函数参数和返回类型的信息合并到函数名中,这使得函数重载成为可能。不幸的是,这意味着你漂亮的函数名,比如 BlockAll (也许那些不太漂亮的 AddIPAddressToBlockedList )变成丑陋的东西。您不想使用名称为的函数 ?UnblockAll@@YAXXZ 是吗?

    4. 名称管理依赖于编译器。因此,在C++中编写Win32 DLL并不是一个好主意,除非您打算仅使用同一编译器(在本例中是微软的C++编译器)编译的可执行文件(或另一个DLL)来使用它。

    如果您想简化您的生活,请使用C而不是C++将函数导出到.NET应用程序中。C++有一个很棒的特性, extern "C" 告诉编译器 将代码视为C代码 使用C悬挂机构(无损坏)。这允许您在C++函数周围编写C包装器。

    编辑:

    我完全忘记的另一种可能性是使用C++互操作(是的,你可以使用C++来在你的Win32 DLL周围写.NET包装),然后只使用Cyl来调用你的.NET包装器。不过,要小心,因为C++/CLI(C++的扩展允许.NET特定语义)是 非常 人为的

        3
  •  0
  •   Dolphin    15 年前

    您需要将方法放入一个dll(动态链接库)中。如果您使用的是Visual Studio,那么您应该能够按照win32 dll新建项目向导进行操作。

        4
  •  0
  •   Jared    15 年前

    另一个选择是使用 Swig 生成C++代码来调用C++函数。这假设你的C++函数被编译成一个DLL,而且你不介意有很多额外的包装代码。这个工具的优点是,您可以从多个语言调用相同的C++代码,而不必编写特定于每种语言的代码。坏的是,它是构建过程中的另一个外部工具,有自己的输入和输出,必须跟踪。