欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-08 16:31:45
最近用c#写一个小软件,要调用vc写的dll,传递参数给dll,由于是非托管代码,所以调用起来有点麻烦,要把参数转换成非托管代码的指针参数,然后再传递给dllview plaincopy to cli...

最近用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# 字符串指针参数内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!