C# 調用Dll 傳遞字符串指針參數

最近用c#寫一個小軟件,要調用VC寫的dll,傳遞參數給dll,由於是非託管代碼,所以調用起來有點麻煩,要把參數轉換成非託管代碼的指針參數,然後再傳遞給dll


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
    }



發佈了11 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章