通过引用从 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;
};
我会给他正确的答案。
我有一个 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;
};
我会给他正确的答案。