gpt4 book ai didi

c++ - 将非托管 C++ 对象传递到托管 C++ 代码

转载 作者:太空狗 更新时间:2023-10-29 21:27:54 25 4
gpt4 key购买 nike

因此,正如标题所述,我希望将在非托管 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;

我真的很想能够从我的托管代码中访问 externed 对象 ReallyNeedThisClass,只需传递对象即可。通过拥有此对象,我希望通过 ReallyNeedThisClass->BoolFunc 访问它的方法。从我的托管代码访问此对象的最佳方式是什么?

编辑:我一直在想也许有一种方法可以使用属性从非托管代码中“获取”对象,然后在托管代码中“设置”同一对象。这是处理这个问题的合适角度吗?我已经稍微清理了这个问题以摆脱无用的细节。

更新:我使用非托管 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

有什么想法吗?

最佳答案

首先,您必须从非托管 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;
};

非托管 dll 也必须使用 UNMANAGED_COMPILE_DEFINITION 预处理器定义进行编译。

其次,删除 extern INeedThisClass ReallyNeedThisClass; 你不需要它。因为 ReallyNeedThisClass 已经是包装类的成员了。

第三,您需要将 System::String^ 编码为 TCHAR* 以便调用 BoolFunc

第四,我不记得了,但如果你包含“Windows.h”或“Winnt.h”,关于WINAPI的错误就会消失。

关于c++ - 将非托管 C++ 对象传递到托管 C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8260535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com