c#调用com的函数声明(一解决立给分)
函数原型:
int __stdcall Abc(UINT us, USHORT usMaxLength, BYTE *pData, USHORT *usLength);
小弟在c#声明中写成:
[DllImport( "AA.dll ", CallingConvention = CallingConvention.StdCall)]
public unsafe static extern int Abc(uint us, ushort usMaxLength, byte[] pData, ref ushort usLength);
可是在vs03中运行会提示NullReference异常,vs05中会提示Attempted to read or write protected memory. This is often an indication that other memory is corrupt异常
但是在vc非夸平台调用代码:
BYTE pBuffer[512];
USHORT usLen = 512;
int rv = Abc(1, usLen, pBuffer, &usLen);
则正常运行。
现在小弟想在net下调用该dll,请问该如何写c#的函数声明呢,请高手帮忙给出详细代码。
一解决立给分。
------解决方案--------------------声明没什么问题,你的pData记得初始化了吧?
ushort len = 256;
byte[] pData = new byte[256];
int rv = Abc(1, len, pData, ref len);
------解决方案--------------------lz:记得你以前发过类似的帖子:
http://community.csdn.net/Expert/topic/5339/5339700.xml?temp=4.096621E-02
你这个接口是普通的dll,不是com组件,在com的IDL规范里,根本不会允许出现:UINT ,USHORT,。。。这样的类型,这些都是MFC用typedef得到专用类型,其他非VC平台是不会识别的。
普通的dll,可以如下转换:
[DllImport( "AA.dll ", CallingConvention = CallingConvention.StdCall)]
public unsafe static extern int Abc(uint us, ushort usMaxLength, IntPtr pData, ref ushort usLength);
ushort len = 256;
byte[] pData = new byte[256];
IntPtr ptr=IntPtr.Zero;
int rv = Abc(1, len, ptr, ref len);
Marshal.PtrToStructure(ptr,pData);