包装在C++/CLI中使用本机接口的本机C++代码
Wrapping native C++ code which uses a native interface in C++/CLI
我目前正试图包装一个原生C++API的一个部分,该部分使用如下定义的原生C++接口:
#pragma once
class BufferReaderInterface
{
public:
virtual ~BufferReaderInterface()
{
}
const static int BUFFER_SIZE = 100;
virtual void ReadNextBuffer(char* buffer) = 0;
};
然后,它被解析器类用于将数据读取到其本地缓冲区中,以便稍后进行如下解析:
#pragma once
#include "BufferReaderInterface.h"
class BufferParser
{
public:
void ReadNextBuffer(BufferReaderInterface& reader)
{
reader.ReadNextBuffer(localBuffer);
}
void ParseBuffer()
{
// do buffer parsing after ReadNextBuffer()...
}
private:
char localBuffer[BufferReaderInterface::BUFFER_SIZE];
};
以下是从文件流读取缓冲区的示例实现(它不一定是文件流,也可以实现为从网络读取):
#pragma once
#include <fstream>
#include "BufferReaderInterface.h"
class FileStreamBufferReader : public BufferReaderInterface
{
public:
FileStreamBufferReader(std::string filename)
{
bufferFile.open(filename.c_str(),
std::ios_base::in | std::ios_base::binary);
if(!bufferFile)
{
throw std::invalid_argument(filename);
}
}
~FileStreamBufferReader()
{
bufferFile.close();
}
void ReadNextBuffer(char* buffer)
{
bufferFile.read((char *)buffer, BUFFER_SIZE);
}
private:
std::ifstream bufferFile;
};
一个简单的用法如下:
BufferReaderInterface* br = new FileStreamBufferReader("test.binary");
BufferParser parser;
parser.ReadNextBuffer(*br);
parser.ParseBuffer();
// use parsed data...
delete br;
我应该如何包装BufferParser
类?我试图在上面使用Pimpl习语,但在正确实现ReadNextBuffer(BufferReaderInterface&)
函数的托管版本时,我遇到了困难。我曾尝试创建public interface class ManagedBufferReaderInterface
,但后来我被卡住了,因为BufferParser
采用了本机C++接口,而C++/CLI类无法实现像BufferReaderInterface
这样的本机C++界面。以前有人遇到过这种情况吗?
任何建议都将不胜感激!
使用抽象类而不是接口怎么样?
public ref class ManagedBufferReaderInterface abstract
{
private public: // internal
BufferReaderInterface * native_interface;
public:
ManagedBufferReaderInterface(BufferReaderInterface * nativeinterface)
: native_interface(nativeinterface)
{ ... }
//...
};
public ref class ManagedBufferParser
{
BufferParser * parser;
public:
ManagedBufferParser()
: parser(new BufferParser())
{ ... }
void ReadNextBuffer(ManagedBufferReaderInterface ^ reader)
{
parser->ReadNextBuffer(reader->native_interface);
}
void ParseBuffer()
{
parser->ParseBuffer();
}
//...
};
添加代码:
#include <msclrmarshal_cppstd.h>
public ref class ManagedFileStreamBufferReader : public ManagedBufferReaderInterface
{
public:
ManagedFileStreamBufferReader(System::String ^ filename)
: ManagedBufferReaderInterface(new FileStreamBufferReader( msclr::interop::marshal_as<std::string>(filename) ) )
{ ... }
// ....
};
//Example
ManagedBufferReaderInterface ^ br = gcnew ManagedFileStreamBufferReader("test.binary");
ManagedBufferParser ^ parser = gcnew ManagedBufferParser();
parser->ReadNextBuffer(br);
parser->ParseBuffer();
相关文章:
- 从C++本机插件更新Vector3数组
- GCC本机矩阵运算库
- VC++本机单元测试,找不到调试符号
- 在这种情况下,java对象是否可以调用本机函数
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 无法将标准库导入本机 android 项目中的头文件
- 使用本机 C++ 应用程序中的 C# 代码
- 在nodejs中使用本机代码的最佳方法是什么?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 在自定义程序中使用本机 Windows 自然顺序排序
- 如何在C++非托管/本机 DLL 中从注册免费 COM C# 托管 DLL 创建 COM 对象
- MS 本机单元测试 - 断言::线程失败不起作用
- 将音频从浏览器流式传输到WebRTC本机C++应用程序
- Winapi - SetWindowLongPtr in ShutdownBlockReason创建/销毁JNI本机代码
- C++/CLI 混合托管/本机 DLL 不起作用
- 子系统中的异常处理:本机
- 多次调用本机方法时出现致命错误
- 如何使用 Malloc 调试来检查本机内存泄漏?
- 使用本机 JNI 静态方法实现C++ Java 运行时错误