關于C#?調(diào)用Dll?傳遞字符串指針參數(shù)的問題
更新時間:2022年01月14日 10:38:03 作者:許明吉博客
這篇文章主要介紹了C#?調(diào)用Dll傳遞字符串指針參數(shù),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
最近用c#寫一個小軟件,要調(diào)用VC寫的dll,傳遞參數(shù)給dll,由于是非托管代碼,所以調(diào)用起來有點麻煩,要把參數(shù)轉換成非托管代碼的指針參數(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 ) 對DBF文件按照指定的字段創(chuàng)建索引"
/// <summary>
/// 對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">出錯信息</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ù)的長度申請非托管空間
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ù)的長度申請非托管空間"
/// <summary>
/// 根據(jù)數(shù)據(jù)的長度申請非托管空間
/// </summary>
/// <param name="strData">要申請非托管空間的數(shù)據(jù)</param>
/// <returns>指向非拖管空間的指針</returns>
private static IntPtr mallocIntptr( string strData )
{
//先將字符串轉化成字節(jié)方式
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>
/// 根據(jù)長度申請非托管空間
/// </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# 調(diào)用Dll 傳遞字符串指針參數(shù)的文章就介紹到這了,更多相關C# 字符串指針參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C#結合JavaScript實現(xiàn)上傳視頻到騰訊云點播平臺的操作方法
這篇文章主要介紹了C#結合JavaScript實現(xiàn)上傳視頻到騰訊云點播平臺,上傳視頻功能,主要要解決兩個問題,一是在服務端通過C#生成簽名和SDKID,二是在客戶端通過JavaScript上傳視頻到騰訊云點播服務器,感興趣的朋友跟隨小編一起看看吧2023-11-11

