通过引用从 C++\CLI 传递到 C++

Passing by refference from C++\CLI to C++

我有一个 C++\CLI 包装器到商业程序的 C++ API。 某个包装函数如下所示:

int ReleaseObject(WDataObject^ object) {
    return (m_api->ReleaseObject(object->m_object));
};

在 API 的先前版本中,C++ 端是:

m_api->ReleaseObject(const api:DataObject *object)

而在当前的API版本中,该功能已更改为:

m_api->ReleaseObject(const api:DataObject *&object)

我对 C++\CLI 的了解是none,我的 C++ 知识也很基础,我不知道如何修改包装函数使其编译。

我想知道如何修改包装器 c++\CLI 函数以根据 C++ API 的期望通过引用传递对象。

编辑:

编译时出错:

Error   3   error C2664: 'int api::Api::ReleaseObject(api::DataObject *&)' : cannot convert argument 1 from 'api::DataObject *' to 'api::DataObject *&' ...\pf_api_test - 15.2.2\libs\digapiwrapper15.1_64bit\digApiWrapper.h   851 1   digApiWrapper

编辑 2:

    [SerializableAttribute]
        public ref class WDataObject {
            public:

            api::DataObject* m_object;

            WApi^ t_api;

            String^  Name;
            int  Class;
            String^ key;

            WDataObject(api::DataObject* obj) { m_object = obj; };

            ~WDataObject();

 /*HERE GOES ALL THE FUNCTIONS WHICH I'M NOT SURE IF THEY ARE RELEVANT*/
    }

您必须传递一个指向您的 m_object 变量的指针。您没有引用编译器错误消息,但有点可以猜测,它不允许您将指针传递给托管 class 的成员。当垃圾收集器在执行本机代码时移动对象时,结果往往很糟糕。

必须创建一个稳定的指针引用,最简单的方法是将指针复制到局部变量。像这样:

int ReleaseObject(WDataObject^ object) {
    api:DataObject* arg = object->m_object;
    int retval = m_api->ReleaseObject(&arg);
    object->m_object = arg;
    return retval;
}

它还修复了原始代码中可能存在的错误,您可能应该自己将 m_object 设置为 NULL,这样您就不会再次发布它。请务必检查析构函数和终结器中的 NULL,并且不要再次调用 ReleaseObject()。

经过大量的尝试和错误,我得到了Hans Passant的答案:

int ReleaseObject(WDataObject^ object) {
    //Before: return (m_api->ReleaseObject(object->m_object));
    api::DataObject* obj = object->m_object;
    int val = m_api->ReleaseObject(obj);
    object->m_object = obj;
    return val;
};

我会给他正确的答案。