關(guān)于C#?調(diào)用Dll?傳遞字符串指針參數(shù)的問(wèn)題
最近用c#寫一個(gè)小軟件,要調(diào)用VC寫的dll,傳遞參數(shù)給dll,由于是非托管代碼,所以調(diào)用起來(lái)有點(diǎn)麻煩,要把參數(shù)轉(zhuǎn)換成非托管代碼的指針參數(shù),然后再傳遞給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 ) 對(duì)DBF文件按照指定的字段創(chuàng)建索引" /// <summary> /// 對(duì)DBF文件按照指定的字段創(chuàng)建索引 /// </summary> /// <param name="m_strFileName">DBF文件路徑</param> /// <param name="m_strFieldName">創(chuàng)建索引的字段名稱</param> /// <param name="m_key">索引桶數(shù)(文件記錄的最大數(shù))</param> /// <param name="strErr">出錯(cuò)信息</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; //根據(jù)數(shù)據(jù)的長(zhǎng)度申請(qǐng)非托管空間 ptrFileName = mallocIntptr(m_strFileName); ptrFieldName = mallocIntptr(m_strFieldName); ptrErr = mallocIntptr(300); //創(chuàng)建索引 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 ) 根據(jù)數(shù)據(jù)的長(zhǎng)度申請(qǐng)非托管空間" /// <summary> /// 根據(jù)數(shù)據(jù)的長(zhǎng)度申請(qǐng)非托管空間 /// </summary> /// <param name="strData">要申請(qǐng)非托管空間的數(shù)據(jù)</param> /// <returns>指向非拖管空間的指針</returns> private static IntPtr mallocIntptr( string strData ) { //先將字符串轉(zhuǎn)化成字節(jié)方式 Byte[] btData = System.Text.Encoding.Default.GetBytes(strData); //申請(qǐng)非拖管空間 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> /// 根據(jù)長(zhǎng)度申請(qǐng)非托管空間 /// </summary> /// <param name="strData">要申請(qǐng)非托管空間的大小</param> /// <returns>指向非拖管空間的指針</returns> private static IntPtr mallocIntptr( int length ) { //申請(qǐng)非拖管空間 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 }
到此這篇關(guān)于C# 調(diào)用Dll 傳遞字符串指針參數(shù)的文章就介紹到這了,更多相關(guān)C# 字符串指針參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C#環(huán)形緩沖區(qū)(隊(duì)列)完全實(shí)現(xiàn)
- C#讀取中文字符及清空緩沖區(qū)的實(shí)現(xiàn)代碼
- C#調(diào)用帶結(jié)構(gòu)體指針Dll的方法
- 深入理解C#指針之美
- 關(guān)于C#調(diào)用C++dll傳指針釋放內(nèi)存問(wèn)題
- C#實(shí)現(xiàn)復(fù)制數(shù)據(jù)庫(kù) C#將A數(shù)據(jù)庫(kù)數(shù)據(jù)轉(zhuǎn)到B數(shù)據(jù)庫(kù)
- C#使用SqlBulkCopy批量復(fù)制數(shù)據(jù)到數(shù)據(jù)表
- C#固定大小緩沖區(qū)及使用指針復(fù)制數(shù)據(jù)詳解
相關(guān)文章
C#結(jié)合JavaScript實(shí)現(xiàn)上傳視頻到騰訊云點(diǎn)播平臺(tái)的操作方法
這篇文章主要介紹了C#結(jié)合JavaScript實(shí)現(xiàn)上傳視頻到騰訊云點(diǎn)播平臺(tái),上傳視頻功能,主要要解決兩個(gè)問(wèn)題,一是在服務(wù)端通過(guò)C#生成簽名和SDKID,二是在客戶端通過(guò)JavaScript上傳視頻到騰訊云點(diǎn)播服務(wù)器,感興趣的朋友跟隨小編一起看看吧2023-11-11C#實(shí)現(xiàn)設(shè)置或屏蔽熱鍵的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)設(shè)置或屏蔽熱鍵,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12