日期:2014-05-18  浏览次数:20996 次

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下载地址。居然是彩色的~解决办法