您好,登錄后才能下訂單哦!
本篇內容主要講解“C#調用Dll傳遞字符串指針參數的方法是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“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文件按照指定的字段創建索引" /// <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傳遞字符串指針參數的方法是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。