iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >关于C# 调用Dll 传递字符串指针参数的问题
  • 599
分享到

关于C# 调用Dll 传递字符串指针参数的问题

2024-04-02 19:04:59 599人浏览 八月长安
摘要

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

最近用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文件按照指定的字段创建索引"   
        /// <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# 调用Dll 传递字符串指针参数的文章就介绍到这了,更多相关C# 字符串指针参数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 关于C# 调用Dll 传递字符串指针参数的问题

本文链接: https://www.lsjlt.com/news/162493.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作