读书人

c#调用com的函数声明(一解决立给分),该

发布时间: 2012-01-30 21:15:58 作者: rapoo

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);

读书人网 >C#

热点推荐