如何围绕 C++ 代码编写 C 包装器以公开类方法

Posted

技术标签:

【中文标题】如何围绕 C++ 代码编写 C 包装器以公开类方法【英文标题】:how to write c wrapper around c++ code to expose class methods 【发布时间】:2011-10-28 13:27:46 【问题描述】:

我在非托管 c++ 中有许多 cpp 文件,我想使用 P\Invoke 从 vb .net 访问这些文件的类方法,为此我编写了 C 包装器来公开类方法。谁能帮助我,如何围绕 C++ 代码编写一个 c 包装器。我正在复制我的文件的一些代码,请帮我为这些函数编写 c 包装器。

#include "StdAfx.h"
#include "Verify.h"

Verify::Verify(void)
    :_verified(false)



Verify::~Verify(void)



void Verify::SetVerified(bool value)

    _verified = value;


bool Verify::GetVerified(void) const

        _verified;


void Verify::SetFailurePoint(std::basic_string<TCHAR> const & value)

    _failurePoint = value;


std::basic_string<TCHAR> const & Verify::GetFailurePoint(void) const

    return _failurePoint;

【问题讨论】:

【参考方案1】:

在 wrapper.h 中:

    typedef void * VERIFY_HANDLE;
    extern VERIFY_HANDLE Verify_Create();
    extern void VERIFY_SetVerified(VERIFY_HANDLE, bool);
    extern bool VERIFY_GetVerified(VERIFY_HANDLE);
    /* etc, etc */

在 wrapper.c 中:

    #include "wrapper.h"
    #include "Verify.h"
    VERIFY_HANDLE Verify_Create()  return (VERIFY_HANDLE) new Verify(); 
    void SetVerified(VERIFY_HANDLE h, bool b)  ((Verify *)h)->SetVerified(b); 
    bool GetVerified(VERIFY_HANDLE h)  return ((Verify *)h)->GetVerified();  

【讨论】:

【参考方案2】:

会是这样的:

extern "C" 
    typedef void *VERIFY;

    VERIFY create_verify() 
        return (VERIFY)new Verify();
    
    void verify_set(VERIFY verify, int value) 
        ((Verify*)verify)->SetVerified((bool)value);
    
    int verify_get(VERIFY verify) 
        return ((int)((Verify*)verify)->GetVerified());
    

更多信息Oracle pages

【讨论】:

以上是关于如何围绕 C++ 代码编写 C 包装器以公开类方法的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 调用 C++ dll 方法/类

如何将 cli::array 从本机代码转换为本机数组?

如何将围绕 C++ 函数的 R 包装器转换为 Python/Numpy

如何包装VB代码和C ++代码并将其作为3个COM接口用于第三方?

从 .NET 代码中销毁非托管对象

如何使用 cython 将 python 类公开给 c++