C# 调用Dll 传递字符串指针参数 .

最近用c#写一个小软件,要调用VC写的dll,传递参数给dll,由于是非托管代码,所以调用起来有点麻烦,要把参数转换成非托管代码的指针参数,然后再传递给dll
  1. using System.Runtime.InteropServices;   //操作Dll的类空间   
  2.   
  3.  class CGicomIndex  
  4.     {  
  5.         [DllImport("Index_dll.dll")]  
  6.         unsafe private static extern Int32 create_index_file(IntPtr filename, IntPtr fieldname, UInt32 tongshu, IntPtr err);  
  7.         //VC原型 create_index_file( char*filename, char * fieldname, unsigned long tongshu, char *err);  
  8.  
  9.         #region " bool CreateIndexFile( string m_strFileName, string m_strFieldName, UInt32 m_key, ref string strErr ) 对DBF文件按照指定的字段创建索引"   
  10.         /// <summary>   
  11.         /// 对DBF文件按照指定的字段创建索引   
  12.         /// </summary>   
  13.         /// <param name="m_strFileName">DBF文件路径</param>   
  14.         /// <param name="m_strFieldName">创建索引的字段名称</param>   
  15.         /// <param name="m_key">索引桶数(文件记录的最大数)</param>   
  16.         /// <param name="strErr">出错信息</param>   
  17.         /// <returns>成功 true</returns>   
  18.         public static bool CreateIndexFile( string m_strFileName, string m_strFieldName, UInt32 m_key, ref string strErr )  
  19.         {  
  20.             try  
  21.             {  
  22.                 IntPtr ptrFileName, ptrFieldName, ptrErr;  
  23.   
  24.                 //根据数据的长度申请非托管空间   
  25.                 ptrFileName = mallocIntptr(m_strFileName);  
  26.                 ptrFieldName = mallocIntptr(m_strFieldName);  
  27.                 ptrErr = mallocIntptr(300);  
  28.   
  29.                 //创建索引   
  30.                 if (create_index_file(ptrFileName, ptrFieldName, m_key, ptrErr) != 1)  
  31.                 {  
  32.                     strErr = Marshal.PtrToStringAnsi(ptrErr);  
  33.                     Marshal.FreeHGlobal(ptrFileName);  
  34.                     Marshal.FreeHGlobal(ptrFieldName);  
  35.                     Marshal.FreeHGlobal(ptrErr);  
  36.                     return false;  
  37.                 }  
  38.                 Marshal.FreeHGlobal(ptrFileName);  
  39.                 Marshal.FreeHGlobal(ptrFieldName);  
  40.                 Marshal.FreeHGlobal(ptrErr);  
  41.                 return true;  
  42.             }  
  43.             catch (System.Exception ex)  
  44.             {  
  45.                 strErr = ex.Message;  
  46.                 return false;  
  47.             }  
  48.         }  
  49.         #endregion  
  50.  
  51.         #region " IntPtr mallocIntptr( string strData ) 根据数据的长度申请非托管空间"   
  52.         /// <summary>   
  53.         /// 根据数据的长度申请非托管空间   
  54.         /// </summary>   
  55.         /// <param name="strData">要申请非托管空间的数据</param>   
  56.         /// <returns>指向非拖管空间的指针</returns>   
  57.         private static IntPtr mallocIntptr( string strData )  
  58.         {  
  59.             //先将字符串转化成字节方式   
  60.             Byte[] btData = System.Text.Encoding.Default.GetBytes(strData);  
  61.   
  62.             //申请非拖管空间   
  63.             IntPtr m_ptr = Marshal.AllocHGlobal(btData.Length);  
  64.   
  65.             //给非拖管空间清0    
  66.             Byte[] btZero = new Byte[btData .Length+ 1]; //一定要加1,否则后面是乱码,原因未找到   
  67.             Marshal.Copy(btZero, 0, m_ptr, btZero.Length);  
  68.   
  69.             //给指针指向的空间赋值   
  70.             Marshal.Copy(btData, 0, m_ptr, btData.Length);  
  71.   
  72.             return m_ptr;  
  73.         }  
  74.   
  75.         /// <summary>   
  76.         /// 根据长度申请非托管空间   
  77.         /// </summary>   
  78.         /// <param name="strData">要申请非托管空间的大小</param>   
  79.         /// <returns>指向非拖管空间的指针</returns>   
  80.         private static IntPtr mallocIntptr( int length )  
  81.         {  
  82.             //申请非拖管空间   
  83.             IntPtr m_ptr = Marshal.AllocHGlobal(length);  
  84.   
  85.             //给非拖管空间清0    
  86.             Byte[] btZero = new Byte[length + 1]; //一定要加1,否则后面是乱码,原因未找到   
  87.             Marshal.Copy(btZero, 0, m_ptr, btZero.Length);  
  88.   
  89.             //给指针指向的空间赋值   
  90.             Marshal.Copy(btZero, 0, m_ptr, length);  
  91.   
  92.             return m_ptr;  
  93.         }  
  94.         #endregion   
  95.     }  
posted @ 2011-07-06 11:55  许明吉博客  阅读(17630)  评论(1编辑  收藏  举报