调用C++DLL的时候如何转换char**参数阿

viki117 2012-06-15 10:05:15
C++中定义的方法
extern "C"{
_declspec(dllexport) bool ST_GetImageFromVideo(const char* videoPath,char** pBuf,unsigned int& nSize,int& nWidth,int& nHeight);
};

char** pBuf是个位图的数组,在C#中调用这个方法的时候,怎么处理char**字段阿?
...全文
345 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
viki117 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

2#的代码差不多了
不过应该是IntPtr p = new IntPtr();
还有[DllImport("...dll", CallingConvention = CallingConvention.Cdecl)]
[/Quote]

OK了,搞了半天就差这句了“CallingConvention = CallingConvention.Cdecl)”
WAN 2012-06-15
  • 打赏
  • 举报
回复
另外#6的代码,pBuf没考虑到释放的问题,会造成内存泄露
最好还是改为调用方申请并释放内存
WAN 2012-06-15
  • 打赏
  • 举报
回复
2#的代码差不多了
不过应该是IntPtr p = new IntPtr();
还有[DllImport("...dll", CallingConvention = CallingConvention.Cdecl)]
__天涯寻梦 2012-06-15
  • 打赏
  • 举报
回复
[DllImport("...")]
[return: MarshalAs(UnmanagedType.I1)]
private static extern bool ST_GetImageFromVideo(string videoPath, ref IntPtr pBuf, ref uint nSize, ref int nWidth, ref int nHeight);

其他参数类型声明是不是这样
viki117 2012-06-15
  • 打赏
  • 举报
回复

bool AviPlayer::GetImageFromVideo(const char* videoPath,char** pBuf,unsigned int& nSize,int& nWidth,int& nHeight )
{
m_sLastError="";
if (!openFile(videoPath))
{
return false;
}
*pBuf=new char[m_frameSize];
if(!getFrame(26,*pBuf))
{
delete *pBuf;
pBuf=NULL;
return false;
}
nSize=m_frameSize;
nWidth=m_video_width;
nHeight=m_video_height;
stop();
return true;
}
__天涯寻梦 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
引用 2 楼 的回复:

是这个函数内部分配了内存把指针传出还是让调用方分配好内存在函数内部写入?
如果是第一种就
ST_GetImageFromVideo(...,ref Intptr pBuf, ......)
IntPtr p = IntPtr.Zero;
ST_GetImageFromVideo(..., ref p, ...);
byte[] arr = new byte[……
[/Quote]
函数内部是如何处理 pBuf 的?
viki117 2012-06-15
  • 打赏
  • 举报
回复
对 PInvoke 函数“SVC!SVC.MainWindow::ST_GetImageFromVideo”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配
viki117 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

是这个函数内部分配了内存把指针传出还是让调用方分配好内存在函数内部写入?
如果是第一种就
ST_GetImageFromVideo(...,ref Intptr pBuf, ......)
IntPtr p = IntPtr.Zero;
ST_GetImageFromVideo(..., ref p, ...);
byte[] arr = new byte[nSize];
Marsh……
[/Quote]
这个方法我测试过,不行。。。
__天涯寻梦 2012-06-15
  • 打赏
  • 举报
回复
是这个函数内部分配了内存把指针传出还是让调用方分配好内存在函数内部写入?
如果是第一种就
ST_GetImageFromVideo(...,ref Intptr pBuf, ......)
IntPtr p = IntPtr.Zero;
ST_GetImageFromVideo(..., ref p, ...);
byte[] arr = new byte[nSize];
Marshal.Copy(p, arr, 0, nSize);

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧