【问题标题】:Passing by refference from C++\CLI to C++通过引用从 C++\CLI 传递到 C++
【发布时间】:2015-05-26 13:15:24
【问题描述】:

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

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一无所知,而且我的C++知识非常基础,我不知道如何修改包装函数以使其编译。

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

编辑:

编译时出错:

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*/
    }

【问题讨论】:

  • 它现在是否编译,或者你只是在猜测?如果是这样,请指定 exact 错误。
  • 现在无法编译,请看编辑。
  • 谁能解释一下^WDataObject^是什么?
  • @SantiPeñate-Vera 你能告诉你WDataObject的声明吗?我不知道没有它我们有足够的信息。

标签: .net c++-cli interop native


【解决方案1】:

您必须将指针传递给您的m_object 变量。您没有引用编译器错误消息,但有些猜测,它不允许您将指针传递给托管类的成员。当垃圾收集器在本机代码执行时移动对象时,这往往会以非常糟糕的方式结束。

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

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()。

【讨论】:

  • 感谢您的回复,但是还不行。在 [api:DataObject* arg = object->m_object;] 上,错误是 [不允许使用指向 C++/CLI ref 类或接口类的普通指针] 和 [int retval = m_api->ReleaseObject(&arg);]错误是[对非常量的引用的初始值必须是左值]。我相信这与 * 用于 C++ 而不是 C++\CLI 的事实有关。
【解决方案2】:

经过大量的尝试和错误,我得到了 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;
};

我会给他的答案是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多