因此,正如标题所述,我希望将在非托管C ++项目中定义的对象传递到托管C ++ / CLI项目(两个项目都在同一个解决方案中),同时仍然能够访问相同的方法在非托管C ++项目中。
此对象是一个类,它通过使用typedef
的方式从单独的非托管C ++ dll(不在同一个项目或解决方案中)导入函数,如下所示(标题摘录):
#pragma unmanaged
typedef BOOL (WINAPI *someBoolFunc) (DWORD Name, DWORD Flags, TCHAR* Text);
class INeedThisClass
{
public:
INeedThisClass();
~INeedThisClass();
someBoolFunc BoolFunc;
};
extern INeedThisClass ReallyNeedThisClass;
我真的希望能够通过传递对象从托管代码中访问extern
ed对象ReallyNeedThisClass
。通过拥有此对象,我希望通过ReallyNeedThisClass->BoolFunc
访问它的方法。从托管代码访问此对象的最佳方法是什么?
编辑:我一直在想也许有一种方法可以使用属性从非托管代码“获取”对象,然后在托管代码中“设置”相同的对象。这可能是解决这个问题的合适角度吗?我已经清理了一些问题以消除无用的细节。
UPDATE :我使用非托管C ++代码的包装器在这方面取得了进展,但当然还存在问题。以上面的class
为例,我将向您展示我到目前为止所做的工作。
项目1:非托管C ++类(上面的示例)
项目2:托管C ++ / CLR包装类(下面的示例)
Wrapper.h :
#pragma once
#include "INeedThisClass.h" //Unmanaged class INeedThisClass
using namespace System;
using namespace System::Runtime::InteropServices;
namespace INeedThisClassWrapper
{
public ref class INTC
{
public:
INTC(void);
virtual ~INTC(void);
delegate bool BoolFunc(UInt32 Name, UInt32 Flags, String^ Text);
private:
INeedThisClass *ReallyNeedThisClass;
};
}
Wrapper.cpp :
#include "Stdafx.h"
#include "Wrapper.h"
using namespace INeedThisClassWrapper
#include <msclr/marshal.h>
using namespace msclr::interop;
INTC::INTC(void)
{
ReallyNeedThisClass = new INeedThisClass();
}
INTC::~INTC(void)
{
if (ReallyNeedThisClass)
{
delete ReallyNeedThisClass;
ReallyNeedThisClass = NULL;
}
}
bool INTC::BoolFunc(UInt32 Name, UInt32 Flags, String^ Text)
{
return ReallyNeedThisClass->BoolFunc;
}
现在我收到来自编译器的错误说明:
error C2065: 'WINAPI': undeclared identifier
error C2065: 'someBoolFunc': undeclared identifier
error C4430: missing type specifier - int assumed. Note C++ does not support default-int
有什么想法吗?
答案 0 :(得分:3)
首先,您必须从非托管dll导出INeedThisClass
并从托管dll导入。
//unmanaged header
#if UNMANAGED_COMPILE_DEFINITION
#define EXPORT_OR_IMPORT __declspec(dllexport)
#else
#define EXPORT_OR_IMPORT __declspec(dllimport)
#endif
class EXPORT_OR_IMPORT INeedThisClass
{
public:
INeedThisClass();
~INeedThisClass();
someBoolFunc BoolFunc;
};
还必须使用UNMANAGED_COMPILE_DEFINITION预处理器定义编译非托管dll。
其次,删除extern INeedThisClass ReallyNeedThisClass;
您不需要它。因为ReallyNeedThisClass
已经是包装类的成员。
第三,您需要将System::String^
封送到TCHAR*
才能拨打BoolFunc
第四,我不记得但是如果你包含“Windows.h”或“Winnt.h”,那么关于WINAPI
的错误就会消失。