110,537
社区成员
发帖
与我相关
我的任务
分享
CGSTATUS __stdcall BeginCGCard(int nDevice, HCG *pHandle);
CGSTATUS __stdcall CGSetVideoStandard(HCG hcg, VIDEO_STANDARD mode);
extern "C" __declspec(dllexport) void dowork(byte* from,void* to,int length);
void dowork(byte* from,void* to,int length)
{
byte* tmp = (byte*)to;
for(int i = 0;i<length;i++)
{
*tmp = *from;
tmp++;
from++;
}
}
namespace CGVideoWrapper {
public ref class CLRWrapper
{
public:
generic <typename T> where T : value class
static T Read(array<Byte>^ data)
{
T value;
pin_ptr<System::Byte> src = &data[0];
pin_ptr<T> dst = &value;
byte* a = (byte*)src;
void* b = (void*)dst;
dowork(a,b,sizeof(T));
return value;
}
};
}
看下这段例子,dowork是C++定义的一个方法,用于将from指针中的内容复制到to指针里面去,实现对象的拷贝,第三个参数是需要拷贝的长度。显然这个方法不能被C#直接调用,那么我就用这个Read方法封装下,那个Read方法的输入参数是array<Byte>^ data,为托管类型字节数组,输出为结构体T(泛型),作用是将字节转换为对应的结构体。为了能够使用那个dowork进行操作,函数Read内部对输入参数处理,转换为byte* a,输出的托管对象value也进行处理,得到它的指针,这样就可以用dowork进行操作了,最后返回的是托管对象value,整个操作对Read方法的外部来说,看不到任何非托管类型,非托管类型在内部进行了处理。namespace CGVideoWrapper {
public ref class CLRWrapper
{
private:
CGVideo * CGVideoCpppro;
public:
CLRWrapper(void);
~CLRWrapper(void);
// TODO: 在此处添加此类的方法。
};
}