網站首頁 編程語言 正文
最近用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 }
原文鏈接:https://www.cnblogs.com/jxsoft/archive/2011/07/06/2099061.html
相關推薦
- 2022-05-06 Python基于LightGBM進行時間序列預測_python
- 2023-07-16 springboot動態端口
- 2022-03-22 ASP.NET Core中如何使用Dapper
- 2022-08-05 Python時間操作之pytz模塊使用詳解_python
- 2022-09-17 C++?中封裝的含義和簡單實現方式_C 語言
- 2022-12-30 antd之RangePicker設置默認值方式_React
- 2022-12-23 Android同步異步任務與多線程及Handler消息處理機制基礎詳細講解_Android
- 2022-12-21 Android?全局通知彈窗示例分析詳解_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支