c#调用c++的dll
函数原型:
/// <param name= "pConvInfo "> 指向用来保存转换器列表的缓存 </param>
/// <param name= "count "> 为缓存中可保存多少个CONVINFO结构。 </param>
/// <param name= "bEnableMsg "> 在搜索的时候是否允许处理窗口消息。 </param>
/// <param name= "timeout "> 超时时间,单位为毫秒。 </param>
/// <returns> 搜索到的转换器的数目 </returns>
int _stdcall FindConverter(CONVINFO *pConvInfo,int count,BOOL bEnableMsg,DWORD timeout);
c#函数申明:
[DllImport( "Setting.dll ",CharSet = CharSet.Ansi)]
internal unsafe static extern int FindConverter(_CONVINFO[] pConvInfo, int count, bool bEnableMsg, uint timeout);
[StructLayout(LayoutKind.Sequential)]
public struct _CONVINFO
{
public ushort devType;
[MarshalAs(UnmanagedType.LPStr, SizeConst = 20)]
public string strIP;
[MarshalAs(UnmanagedType.LPStr, SizeConst = 20)]
public string strMAC;
}
c#调用:
_CONVINFO[] Buffer = new _CONVINFO[256];
int ILen = FindConverter(Buffer, 256, true, 3000);
函数调用后,Buffer里面没有数据返回。怎么回事?
------解决方案--------------------
没有指定封送!为用户定义的结构指定自定义封送处理可以为传递到非托管函数或从非托管函数返回的结构和类的字段指定自定义封送处理属性。通过向结构或类的字段中添加 MarshalAs属性可以做到这一点。还必须使用 StructLayout 属性设置结构的布局,还可以控制字符串成员的默认封送处理,并设置默认封装大小。
示例 3
本示例说明如何为结构指定自定义封送处理属性。
请考虑下面的 C 结构:
C/C++ code
typedef struct tagLOGFONT
{
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;
------解决方案--------------------
C# code
public struct CONVINFO
{
MarshalAs(UnmanagedType.LPStr, SizeConst = 20)]
public ushort devType;
[MarshalAs(UnmanagedType.LPStr, SizeConst = 20)]
public string strIP;
[MarshalAs(UnmanagedType.LPStr, SizeConst = 20)]
public string strMAC;
}
CONVINFO con = new CONVINFO();
[DllImport("gdi32.dll"]
public static extern int FindConverter(ref con,int count,bool bEnableMsg,uint timeout);
<Windows Presentation Unleashed>的Chapter 3下载地址。居然是彩色的~解决办法