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

(0)

相关推荐

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

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

  • 关于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 Int3

  • C#调用C++DLL传递结构体数组的终极解决方案

    C#调用C++DLL传递结构体数组的终极解决方案 在项目开发时,要调用C++封装的DLL,普通的类型C#上一般都对应,只要用DllImport传入从DLL中引入函数就可以了.但是当传递的是结构体.结构体数组或者结构体指针的时候,就会发现C#上没有类型可以对应.这时怎么办,第一反应是C#也定义结构体,然后当成参数传弟.然而,当我们定义完一个结构体后想传递参数进去时,会抛异常,或者是传入了结构体,但是返回值却不是我们想要的,经过调试跟踪后发现,那些值压根没有改变过,代码如下. [DllImport(

  • Android Activity之间相互调用与传递参数的原理与用法分析

    本文实例讲述了Android Activity之间的相互调用与传递参数.分享给大家供大家参考,具体如下: Activity之间是如何调用的 在javaWeb程序中,jsp与jsp之间的调用是通过重定向完成的,而在Android中,Activity与Activity之间的切换是通过Intent来完成的. 所谓Intent,它是Android中非常重要的内置组件,他可以理解为"我要干一件什么事情".在Android中有3大组件:Activity,Service.Broadcast,他们之间

  • jQuery中通过ajax调用webservice传递数组参数的问题实例详解

    下面通过实例给大家说明比较直观些,更方便大家了解. 本人的项目中通过jquery.ajax调用webservice. 客户端代码如下: $.ajax({ url: "test/xxx.asmx", type: 'POST', dataType: 'xml', timeout: , data: { name: "zhangsan", tags: ["aa", "bb", "cc"] }, error: fun

  • python使用ctypes库调用DLL动态链接库

    最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用. ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调用函数. 一.Python调用DLL里面的导出函数 1.VS生成dll 1.1 新建动态链接库项目 1.2 在myTest.cpp中输入以下内容: // myTest.cpp : 定义 DLL 应用程序的导出函数. // #include "stdafx.h" #define DLLEXP

  • jQuery调用Webservice传递json数组的方法

    本文实例讲述了jQuery调用Webservice传递json数组的方法.分享给大家供大家参考,具体如下: Jquery由于提供的$.ajax强大方法,使得其调用webservice实现异步变得简单起来,可以在页面上传递Json字符串到Webservice中,Webservice方法进行业务处理后,返回Json对象给页面,让页面去展现. 这一切都非常的简单,今天要学习的并非这些.我们在实际处理业务过程中,会发现往往页面要传递给webservice 的并非一个或多个字符串,有时候需要传递的是一个组

  • 总结C/C++面试中可能会碰到的字符串指针题

    前言 不知道大家有没有这种体会,很多面试题看似简单,却需要深厚的基本功才能给出完美的解答.企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个strcpy函数吗?我们都觉得自己能,可是我们写出的strcpy很可能只能拿到10分中的2分.读者可从本文看到 strcpy函数从2分到10分解答的例子,看看自己属于什么样的层次.此外,还有一些面试题考查面试者敏捷的思维能力. 分析这些面试题,本身包含很强的趣味性;而作为一名研发人员,通过对这些面试题的

  • java及C++中传值传递、引用传递和指针方式的理解

    java的值传递理解: 代码1: public class Test { /** * @param args */ public static void main(String[] args) { StringBuffer buffer= new StringBuffer("colin"); SChange(buffer); System.out.println( buffer); } public static void SChange (StringBuffer str) { st

  • C语言中 值传递和指针传递实例详解

    C语言中 值传递和指针传递实例详解 在C语言中,函数的参数和返回值的传递方式有两种:值传递和指针传递. 值传递和指针传递初学者总会有一种朦胧的感觉,所以建议把指针传递的概念摸透,才能熟练应用. 值传递示例:x其实是n的一份临时拷贝,所以并不会改变n的值. #include <stdio.h> #include <windows.h> void Fun(int x) { x = 1; } int main() { int n = 2; Fun(n); printf("%d\

  • Nodejs调用Dll模块的方法

    公司项目采用Electron(electronjs.org/)开发pc应用,会涉及到与底层硬件设备的通信,而sdk封装 基本上都是通过 C++ 动态链接库dll实现的. 有两种方案可供选择: 方案一: 使用node-ffi 方案二: 使用C++编写一个node addon,通过LoadLibrary调用dll 以上两种方案都可以解决dll调用问题,方案选型要个人对C++ 的掌握程度,如果熟悉C++开发,可以直接选择方案二最方便.如果完全不了解C++,那么只能采用方案一. 由于笔主不太懂C++,最

随机推荐