关于C#|关于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文件按照指定的字段创建索引////// 【关于C#|关于C# 调用Dll 传递字符串指针参数的问题】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 = https://www.it610.com/article/System.Text.Encoding.Default.GetBytes(strData); //申请非拖管空间IntPtr m_ptr = Marshal.AllocHGlobal(btData.Length); //给非拖管空间清0Byte[] 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); //给非拖管空间清0Byte[] 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 传递字符串指针参数的文章就介绍到这了,更多相关C# 字符串指针参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 关于|关于 Angular view Query 的 id 选择器问题的单步调试
- Angular|Angular 内容投影 content projection 关于条件渲染问题的单步调试
- Angular|Angular 内容投影 content projection 关于选择器问题的单步调试
- skywalking分布式服务调用链路追踪APM应用监控
- 关于施加在|关于施加在 div 标签上的 ngTemplateOutlet 指令让 div class 丢失的问题调试
- 关于|关于 ng-template 通过 @input 传入另一个 Component 不能工作的问题调试
- 前端|8.Django怎样去调用漂亮的HTML前端页面()
- 学习笔记|关于马尔可夫过程的一些学习笔记
- python|python 与c++相互调用实现
- 通过Feign进行调用@FeignClient|通过Feign进行调用@FeignClient 找不到的解决方案