千家信息网

C#调用Dll传递字符串指针参数的方法是什么

发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,本篇内容主要讲解"C#调用Dll传递字符串指针参数的方法是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C#调用Dll传递字符串指针参数的方法是什么"
千家信息网最后更新 2025年02月04日C#调用Dll传递字符串指针参数的方法是什么

本篇内容主要讲解"C#调用Dll传递字符串指针参数的方法是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C#调用Dll传递字符串指针参数的方法是什么"吧!

最近用c#写一个小软件,要调用VC写的dll,传递参数给dll,由于是非托管代码,所以调用起来有点麻烦,要把参数转换成非托管代码的指针参数,然后再传递给dllview plaincopy to clipboardprint?

using System.Runtime.InteropServices;   //操作Dll的类空间      class CGicomIndex      {          [DllImport("Index_dll.dll")]          unsafe private static extern Int32 create_index_file(IntPtr filename, IntPtr fieldname, UInt32 tongshu, IntPtr err);          //VC原型 create_index_file( char*filename, char * fieldname, unsigned long tongshu, char *err);           #region " bool CreateIndexFile( string m_strFileName, string m_strFieldName, UInt32 m_key, ref string strErr ) 对DBF文件按照指定的字段创建索引"           ///            /// 对DBF文件按照指定的字段创建索引           ///            /// DBF文件路径           /// 创建索引的字段名称           /// 索引桶数(文件记录的最大数)           /// 出错信息           /// 成功 true           public static bool CreateIndexFile( string m_strFileName, string m_strFieldName, UInt32 m_key, ref string strErr )          {              try              {                  IntPtr ptrFileName, ptrFieldName, ptrErr;                    //根据数据的长度申请非托管空间                   ptrFileName = mallocIntptr(m_strFileName);                  ptrFieldName = mallocIntptr(m_strFieldName);                  ptrErr = mallocIntptr(300);                    //创建索引                   if (create_index_file(ptrFileName, ptrFieldName, m_key, ptrErr) != 1)                  {                      strErr = Marshal.PtrToStringAnsi(ptrErr);                      Marshal.FreeHGlobal(ptrFileName);                      Marshal.FreeHGlobal(ptrFieldName);                      Marshal.FreeHGlobal(ptrErr);                      return false;                  }                  Marshal.FreeHGlobal(ptrFileName);                  Marshal.FreeHGlobal(ptrFieldName);                  Marshal.FreeHGlobal(ptrErr);                  return true;              }              catch (System.Exception ex)              {                  strErr = ex.Message;                  return false;              }          }          #endregion           #region " IntPtr mallocIntptr( string strData ) 根据数据的长度申请非托管空间"           ///            /// 根据数据的长度申请非托管空间           ///            /// 要申请非托管空间的数据           /// 指向非拖管空间的指针           private static IntPtr mallocIntptr( string strData )          {              //先将字符串转化成字节方式               Byte[] btData = System.Text.Encoding.Default.GetBytes(strData);                //申请非拖管空间               IntPtr m_ptr = Marshal.AllocHGlobal(btData.Length);                //给非拖管空间清0                Byte[] btZero = new Byte[btData .Length+ 1]; //一定要加1,否则后面是乱码,原因未找到               Marshal.Copy(btZero, 0, m_ptr, btZero.Length);                //给指针指向的空间赋值               Marshal.Copy(btData, 0, m_ptr, btData.Length);                return m_ptr;          }            ///            /// 根据长度申请非托管空间           ///            /// 要申请非托管空间的大小           /// 指向非拖管空间的指针           private static IntPtr mallocIntptr( int length )          {              //申请非拖管空间               IntPtr m_ptr = Marshal.AllocHGlobal(length);                //给非拖管空间清0                Byte[] btZero = new Byte[length + 1]; //一定要加1,否则后面是乱码,原因未找到               Marshal.Copy(btZero, 0, m_ptr, btZero.Length);                //给指针指向的空间赋值               Marshal.Copy(btZero, 0, m_ptr, length);                return m_ptr;          }          #endregion       }

到此,相信大家对"C#调用Dll传递字符串指针参数的方法是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0