C# 调用C++的dll问题

Badzpp 2013-12-27 10:23:01
C++的DLL提供了一个设置相机白平衡的函数,它的使用方法如下:

// 第一步:打开自动白平衡开关

int nValue = TRUE;

int nLength = sizeof(BOOL);

HVSTATUS status = HVCommand(m_hhv, CMD_ENABLE_AUTO_WHITEBALANCE, &nValue, &nLength);

HV_VERIFY(status);
// 第二步:在回调函数中调用HVBayerToRGB函数

int CALLBACK CmyClass::SnapCallback(HV_SNAP_INFO *pInfo)
{
CmyClass *pMyClass = (CmyClass *)(pInfo->pParam);
// Bayer图像转换为RGB图像
HVBayerToRGB(pMyClass->m_hhv, // 设备句柄
pMyClass->m_pRawBuffer, // 原始数据缓冲区(输入)
pMyClass->m_nMaxWidth, // 图像宽度
pMyClass->m_nMaxHeight, // 图像高度
true, // 翻转图像
(HV_ADC_LEVEL)pMyClass->m_nADCLevel, // AD转换级别
BAYER2RGB_NEIGHBOUR1, // Raw2RGB算法
pMyClass->m_pImageBuffer, // 转换后的缓冲区(输出)
&( pMyClass->m_wbRatio) // 白平衡比例系数
);
……
}
在C#中这个方法被转换为
public extern static HVSTATUS HVCommand(IntPtr pHandle, HV_COMMAND_CODE CommandCode, IntPtr pContext, IntPtr pLength);
最后两个参数我该定义什么类型,输入什么值?
...全文
158 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Badzpp 2014-01-17
  • 打赏
  • 举报
回复
引用 6 楼 dixh1989 的回复:
[quote=引用 5 楼 yuekunge 的回复:] [quote=引用 4 楼 dixh1989 的回复:] 为什么不试下我写的那个加out的那个方法呢。。。 你原函数明明用的&引用符号,函数里面会对输入的参数的值进行更改,你自己写的函数输入一个(IntPtr)1, (IntPtr)4,函数里面当然赋值出错啊~
应该用 ref 吧··[/quote] 貌似应该是ref。。没注意他前面给2个参数赋值了。。[/quote] 谢谢你的细心回复,这个转换是dll自己封装的,最后我只能在C#中使用usafe引用c++源码解决的
是_这样吗 2014-01-03
  • 打赏
  • 举报
回复
引用 5 楼 yuekunge 的回复:
[quote=引用 4 楼 dixh1989 的回复:] 为什么不试下我写的那个加out的那个方法呢。。。 你原函数明明用的&引用符号,函数里面会对输入的参数的值进行更改,你自己写的函数输入一个(IntPtr)1, (IntPtr)4,函数里面当然赋值出错啊~
应该用 ref 吧··[/quote] 貌似应该是ref。。没注意他前面给2个参数赋值了。。
敌敌畏耶 2014-01-03
  • 打赏
  • 举报
回复
引用 4 楼 dixh1989 的回复:
为什么不试下我写的那个加out的那个方法呢。。。 你原函数明明用的&引用符号,函数里面会对输入的参数的值进行更改,你自己写的函数输入一个(IntPtr)1, (IntPtr)4,函数里面当然赋值出错啊~
应该用 ref 吧··
是_这样吗 2014-01-03
  • 打赏
  • 举报
回复
为什么不试下我写的那个加out的那个方法呢。。。 你原函数明明用的&引用符号,函数里面会对输入的参数的值进行更改,你自己写的函数输入一个(IntPtr)1, (IntPtr)4,函数里面当然赋值出错啊~
Badzpp 2013-12-27
  • 打赏
  • 举报
回复
那个函数方法是封装的DLL不能更改,我现在调用的时候一直出错

我如果写成这样
HVSTATUS status = USBCameraAPI.HVCommand(m_pHandle, HV_COMMAND_CODE.CMD_ENABLE_AUTO_WHITEBALANCE, (IntPtr)0, (IntPtr)4);不会报错
但是如果这样写
HVSTATUS status = USBCameraAPI.HVCommand(m_pHandle, HV_COMMAND_CODE.CMD_ENABLE_AUTO_WHITEBALANCE, (IntPtr)1, (IntPtr)4);会提示图片中的错误
我想输入一个跟c++程序中含义相同的值,设置该函数执行True打开自动白平衡
晚安苏州 2013-12-27
  • 打赏
  • 举报
回复
你都定义成指针类型IntPtr了,那就传IntPtr呗,比如:

int test= 20;             
IntPtr ptr = Marshal.AllocHGlobal(100);            
Marshal.StructureToPtr(test, ptr, true);
//把ptr传到你的函数中IntPtr类型的参数里就over了
是_这样吗 2013-12-27
  • 打赏
  • 举报
回复
&符号应该是引用吧,貌似要写
public extern static HVSTATUS HVCommand(IntPtr pHandle, HV_COMMAND_CODE CommandCode,out int pContext,out int pLength);

110,538

社区成员

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

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

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