- 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文件按照指定的字段创建索引"
- /// <summary>
- /// 对DBF文件按照指定的字段创建索引
- /// </summary>
- /// <param name="m_strFileName">DBF文件路径</param>
- /// <param name="m_strFieldName">创建索引的字段名称</param>
- /// <param name="m_key">索引桶数(文件记录的最大数)</param>
- /// <param name="strErr">出错信息</param>
- /// <returns>成功 true</returns>
- 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 ) 根据数据的长度申请非托管空间"
- /// <summary>
- /// 根据数据的长度申请非托管空间
- /// </summary>
- /// <param name="strData">要申请非托管空间的数据</param>
- /// <returns>指向非拖管空间的指针</returns>
- 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;
- }
- /// <summary>
- /// 根据长度申请非托管空间
- /// </summary>
- /// <param name="strData">要申请非托管空间的大小</param>
- /// <returns>指向非拖管空间的指针</returns>
- 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#调用C++编写的DLL函数各种参数传递问题
- C#调用c++Dll结构体数组指针的问题
- c# 调用C/C++ DLL,传入返回结构体以及指针数组(指针指向自定义的结构体)
- C#调用C++ dll中uchar*参数
- C#委托(delegate)的常用方式- 委托的定义 // 委托的核心是跟委托的函数结构一样 public delegate string SayHello(string c); public delegate string SayHello(string c);:定义了一个公共委托类型 SayHello,该委托接受一个 string 类型的参数 c,并返回一个 string 类型的值。 Main 方法 static void Main(string args) { // 本质上其实就是把方法当作委托的参数 SayHello sayC = new SayHello(SayChinese); Console.WriteLine(sayC("欢迎大家")); SayHello sayE = new SayHello(SayEgnlish); Console.WriteLine(sayE("Welcome to")); // 简单的写法:必须类型一样 SayHello s1 = SayChinese; SayHello s2 = SayEgnlish; Console.WriteLine(s1("好好好")); Console.WriteLine(s2("Gooood")); // 最推荐 SayHello ss1 = con => con; Console.WriteLine(ss1("niiiice")); // 匿名委托:一次性委托 SayHello ss3 = delegate(string s) { return s; }; Console.WriteLine(ss3("说中国话")); } 常规实例化委托 SayHello sayC = new SayHello(SayChinese);:创建了一个 SayHello 委托的实例 sayC,并将 SayChinese 方法作为参数传递给委托的构造函数。 Console.WriteLine(sayC("欢迎大家"));:通过委托实例调用 SayChinese 方法,并输出结果。 同理,SayHello sayE = new SayHello(SayEgnlish); 和 Console.WriteLine(sayE("Welcome to")); 是对 SayEgnlish 方法的委托调用。 简化的委托赋值方式 SayHello s1 = SayChinese; 和 SayHello s2 = SayEgnlish;:当委托类型和方法签名一致时,可以直接将方法赋值给委托变量,无需使用 new 关键字。 Console.WriteLine(s1("好好好")); 和 Console.WriteLine(s2("Gooood"));:通过委托实例调用相应的方法。 使用 Lambda 表达式实例化委托 SayHello ss1 = con => con;:使用 Lambda 表达式创建委托实例 ss1,con => con 表示接受一个参数 con 并返回该参数本身。 Console.WriteLine(ss1("niiiice"));:通过委托实例调用 Lambda 表达式。 匿名委托 SayHello ss3 = delegate(string s) { return s; };:使用匿名委托创建委托实例 ss3,delegate(string s) { return s; } 是一个匿名方法,直接在委托实例化时定义了方法体。 Console.WriteLine(ss3("说中国话"));:通过委托实例调用匿名方法。 委托引用的方法定义 public static string SayChinese(string content) { return content; } public static string SayEgnlish(string content) { return content; } public static string SayChinese(string content) 和 public static string SayEgnlish(string content):定义了两个静态方法,分别接受一个 string 类型的参数 content,并返回该参数本身。这两个方法的签名与 SayHello 委托一致,可以被 SayHello 委托引用。 常规的委托实例化、简化的赋值方式、Lambda 表达式和匿名委托。委托在 C# 中是一种强大的机制,它允许将方法作为参数传递,实现了代码的灵活性和可扩展性。
- Labview调用C++ dll之字符串数组传递
- 在C#中调用含有指针和结构体的C语言DLL
- 【问题】Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数
- 绝对好文C#调用C++DLL传递结构体数组的终极解决方案
- 调用C#类的成员函数的时候,编译器有没有插入this指针作为参数(如同C++一样)?