关于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 传递字符串指针参数的文章就介绍到这了,更多相关C# 字符串指针参数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-01-11

C#连接Oracle数据库字符串(引入DLL)的方式

需求: 从一台Oracle数据库获取数据,本以为是很简单的事情,直接将原来的SqlClient换成OracleClient调用,结果远没自己想的简单.要么安装Oracle客户端,要么安装PLSQL.网上这方面搜索后,太多的文章,还要不停的去测试.最后找个引入外部类库的方式.这个DLL其实是Oracle为C#专门提供的,在它的官方也可以下载到(不过找起来很麻烦). 这里我就把这个方案和dll分享给大家. 点击这里下载 DEMO示例 using Oracle.ManagedDataAccess.Cl

C#连接Oracle数据库使用Oracle.ManagedDataAccess.dll

在刚接触C#的时候由于公司使用的就是Oracle数据库,那么C#怎么连接Oracle数据库就成了首要去掌握的知识点了.在那时没有ODP.NET,但visual studio却对Oralce数据库的调用进行了集成,就是下图中的这个,尽管现在使用这个的时候visual studio提醒过时的,但在那时却是非常好用的. 为什么现在visual studio中这个程序集依然能使用,有ODP.NET,单单要拿出Oracle.ManagedDataAccess.dll进行本文的重点呢? 1.visual s

php连接oracle数据库的核心步骤

本文实例讲述了php连接oracle数据库的核心步骤.分享给大家供大家参考,具体如下: 1.修改php.ini文件,打开extension=php_oci8.dll扩展. 2.拷贝php安装目录/ext/php_oci8.dll文件到system32目录下. 3.测试代码: $conn = oci_connect("scott", "tiger", $db); if (!$conn) { $e = oci_error(); print htmlentities($e

php连接oracle数据库的方法(测试成功)

本文简单分析了php连接oracle数据库的方法.分享给大家供大家参考,具体如下: PHP提供了两套函数与Oracle连接,分别是ORA_和OCI函数.其中ORA_函数略显陈旧.OCI函数更新据说更好一些.两者的使用语法几乎相差无几.你的PHP安装选项应该可以支持两者的使用. 由于OCI函数访问oracle8以上的数据库需要用到Oracle8 Call-Interface(OCI8),这个扩展模块需要oracle8的客户端函数库,因此需要连接远程数据库的话,还需要连接端安装oracle客户端软件

Java连接Oracle数据库实例解析

数据库的操作是当前系统开发必不可少的开发部分之一,尤其是在现在的大数据时代,数据库尤为重要.但是你真的懂得Java与数据库是怎么连接的么? 先给大家一个数据库连接的简单实例: package com.java.dbtest; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.

PHP远程连接oracle数据库操作实现方法图文详解

本文实例讲述了PHP远程连接oracle数据库操作实现方法.分享给大家供大家参考,具体如下: 一.以下是基于 wampServer 的php 访问oracle数据库的操作步骤: 1.第一步:让PHP支持OCI 首先,安装PHP的集成运行环境,网上有很多集成,我安装的是WampServer的(具体的安装方法也可以参考之前写的另一篇文章),安装好后,从安装目录中找到php.ini文件,比如我本地的路径是D:\wamp\bin\php\php5.3.3,将php.ini中的php_oci8.dll的;

C#利用ODP.net连接Oracle数据库的操作方法

本文介绍了C#连接Oracle数据库的过程.通过instant client和ODP.net中的Oracle.DataAccess.dll,我们就可以方便的部署.net应用程序或者站点,而不需要安装Oracle客户端.接下来我们就介绍这一过程. 1. ODAC的安装 在oracle的官方网站上下载与你安装的oracle对应版本的ODAC. 下载地址:ODAC Download 下载好后解压安装,安装时不用安装全部的组件.主要安装以下组件: Oracle Instant Client Oracle

ThinkPHP 连接Oracle数据库的详细教程[全]

一. 操作环境搭建 系统:Windows7 旗舰版 64位PHP环境:wampserver2.2e-php5.4.3-httpd2.2.22-mysql5.5.24  32位版下载地址:http://www.wampserver.com/en/ ThinkPHP:3.0正式版下载地址:http://thinkphp.cn/down.html Oracle:Orcale_11gR2  32位版下载地址:http://www.oracle.com/technetwork/cn/indexes/dow

php连接oracle数据库及查询数据的方法

本文实例讲述了php连接oracle数据库及查询数据的方法.分享给大家供大家参考.具体分析如下: php有强大的功能不但可以支持mysql,mssql,mysqli之个我们还可以与oracle数据连接,要让php支持oracle非常的简单我们只要把php.ini中的;extention = php_oci8.dll分号去掉即可. php支持oracle连接函数 php.ini文件中的配置,去掉 ;extention = php_oci8.dll,去掉前面的分号,重启apache就可以了,如果不行

python连接oracle数据库实例

本文实例讲述了python连接oracle数据库的方法,分享给大家供大家参考.具体步骤如下: 一.首先下载驱动:(cx_Oracle) http://www.python.net/crew/atuining/cx_Oracle/ 不过要注意一下版本,根据你的情况加以选择. 二.安装: 首先配置oracle_home环境变量 执行那个exe安装程序就可以了,它会copy一个cx_Oracle.pyd到Libsite-packages目录下. 如果是linux,执行 复制代码 代码如下: pytho