关于网友提出的“ c#中调用c++ dll中遇到棘手的问题”问题疑问,本网通过在网上对“ c#中调用c++ dll中遇到棘手的问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: c#中调用c++ dll中遇到棘手的问题
描述:emguc#c++dllopencv
具体需求是这样的 :
我读取一个视频,播放这个视频,然后把这个视频的每一帧交给别人处理(VC处理).
这个视频的播放.暂停.停止是由我这来控制的.我用C#来处理.
然后现在在c#这边,是可以拆出视频的每一帧
拆出来的格式是 IntPtr然后可以转换成MIplImage、Bitmap等格式的
然后c++的这边的话可以接收 Bitmap * 和IplImage* 格式的,函数定义如下
extern "C" __declspec(dllexport) char* __stdcall aaa(Bitmap * bitmap)
或者
extern "C" __declspec(dllexport) char* __stdcall aaa(IplImage* ip)
但是要封装成dll在c#里调用 这样的话这两个类型的都不支持了
[DllImport("Dlldemo111.dll")] //声明dll里函数
static extern string shibie(/*这里不能出现指针类型的啊*/);
然后再c++里 主要要获取的信息是
BYTE *pBuf = (BYTE*)bitmap.Scan0;
BYTE *pRGB = (BYTE*)malloc(w * h * 3);
尝试过直接传 pBuf进来 把c++函数修改成这样
extern "C" __declspec(dllexport) char* __stdcall aaa(byte *pBuf,int w,int h)
但是会报错的
for(int i = 0; i < h; i++)
memcpy(pRGB + i * w * 3, pBuf + i * nRowBytes, w * 3);
这里会报错......
新手,刚上手,不知道把问题描述清楚没有? 还请高手多多指教...

解决方案1: Bitmap是GDI+的对象,从2进制角度来看C#和C++对它的定义是不同的,因此C++的dll导出函数不能以对象(或对象的指针)为参数。以char*这样的基本类型为导出函数的参数则不会有这个问题,C#不太懂,没办法帮到你,只能给些原则性的建议。
解决方案2:
这个例子是进程间传递数据的经典。
解决方案3: extern "C" __declspec(dllexport) char* __stdcall aaa(unsigned char * bitmap)
解决方案4: 参考
Microsoft SDK\samples\winbase\SharedMem\Consumer.Cpp
Microsoft SDK\samples\winbase\SharedMem\Makefile
Microsoft SDK\samples\winbase\SharedMem\Producer.Cpp
Microsoft SDK\samples\winbase\SharedMem\Queue.h
Microsoft SDK\samples\winbase\SharedMem\ReadMe.Txt
Microsoft SDK\samples\winbase\SharedMem\Common.h
解决方案5: 这样以来,C#调用C++的接口异常简单,所有内部细节均交给C++来实现,当然C++的工程师需要熟悉视频的相关代码或开源库的用法
解决方案6: 具体需求是这样的 :
我读取一个视频,播放这个视频,然后把这个视频的每一帧交给别人处理(VC处理).
这个视频的播放.暂停.停止是由我这来控制的.我用C#来处理.
然后现在在c#这边,是可以拆出视频的每一帧
拆出来的格式是 IntPtr然后可以转换成MIplImage、Bitmap等格式的
然后c++的这边的话可以接收 Bitmap * 和IplImage* 格式的,函数定义如下
我觉得可以换个角度来想问题:
1、视频相关操作(读取、播放、暂停等等)均交给C++来处理,你只需要调用简单的C++的导出接口即可
2、让C++同样提供给你一个获取帧的接口,返回的就是位图或jpeg图的内存流,不要返回VC中的Bitmap对象;
这样在C#中就像使用文件一样使用标准的位图流(存在于内存中的)或jpeg流。
以上介绍了“ c#中调用c++ dll中遇到棘手的问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3650542.html