C#调用C++动态库的一些理解
作者:网络转载 发布时间:[ 2015/1/26 13:34:23 ] 推荐标签:C# C++ net
4,我们知道int是占4个字节的。
下面这个是c++的一个方法
U_CAMER LONG WINAPI CAMER_GetPropery( HANDLE hCamer, _CMRCTL Propery );
假如我们把此函数翻译成c#中的下面这个函数
[DllImport("UCamer.dll", CallingConvention = CallingConvention.Winapi)]
public extern static Uint16 CAMER_GetPropery(IntPtr hCamer, CMRCTL Propery);
我们在c#调用此方法
uint16 m_HiWi_temp = (uint)BCamera.CAMER_GetPropery(m_hCamer, CMRCTL.OUT_SIZE);
发现一个很有趣的问题,此处调用没有问题。也有值,但是他是取的int32中4个字节的2个字节。
我们看原本c++对此函数的调用
*((PULONG)m_HiWi) = *((PULONG)m_Display) = CAMER_GetPropery( m_hCamer, OUT_SIZE );
m_hShow = Disp_Create( m_hWnd, m_HiWi[1], m_HiWi[0], m_nColor, (USERDRAW)((m_ReDrawLine == TRUE) ? DrawLine : NULL), this );
本来CAMER_GetPropery函数只返回了一个long类型。c++中通过指针的转换。把long类型转换成了 pulong,也是ulong的数组。
那c#中怎么我们该怎么调用呢
|
int m_HiWi_temp = BCamera.CAMER_GetPropery(m_hCamer, CMRCTL.OUT_SIZE);
byte[] m_byte_HiWi = BitConverter.GetBytes(m_HiWi_temp);
byte[] temp1 = new byte[2] { m_byte_HiWi[0], m_byte_HiWi[1] };
byte[] temp2 = new byte[2] { m_byte_HiWi[2], m_byte_HiWi[3] };
int width = BitConverter.ToInt16(temp1, 0);
int high = BitConverter.ToInt16(temp2, 0);
|
这里举这个例子是说c++有时真的是返回一个int类型,但是在c++中可以轻松把int类型通过指针轻松转换成两个uint16的数组。所以c#中我们再转换的时候一定有注意了。
总结:其实数据类型的转换主要是对数据存储空间的转换,c++中的数据类型占用多大的空间,只要转换成c#中占同等空间的数据类型可以了。只是c#看哪种数据类型在操作相应的操作方便些。

sales@spasvo.com