【技术资料】在C#调用C的DLL函数中,字符串[多字节]的传入和传出

C#源代码

using System;
using System.Runtime.InteropServices;

namespace TESTDLL
{
    class Program
    {
        static void Main(string[] args)
        {
            //向C++提供的参数
            string inputString = "CS Call C Point Dll!哈哈哈";

            //返回的数据,Byte数据,预先分配内存空间
            Byte[] bPara = new Byte[100];    

            //调用C++中的函数
            IntPtr outputPointer = MyTest(ref bPara[0], inputString);

            //将分配的内存中的数据转换为字符串
            string outputString = System.Text.Encoding.Default.GetString(bPara, 0, bPara.Length);    //将字节数组转换为字符串

            //读出返回的指针中的数据,其实就是预先分配地址中的数据
            string outputString2 = Marshal.PtrToStringAnsi(outputPointer);

            Console.WriteLine("源字符串:");
            Console.WriteLine(inputString);

            Console.WriteLine("传出值:");
            Console.WriteLine(outputString);

            Console.WriteLine("返回值:");
            Console.WriteLine(outputString2);

            Console.ReadLine();
        }

        [DllImport("CDLL.dll", EntryPoint = "MyTest", CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr MyTest(ref byte refOutputBytes, string inputString);

    }
}

C++源代码

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include 
using namespace std;

//函数声明
extern"C" __declspec(dllexport) char* MyTest(char* dest, char* sour);

//函数实现
char* MyTest(char* dest, char* sour)
{
	char* temp = dest;
	while ('\0' != *sour)
	{
		*dest = *sour;
		dest++;
		sour++;
	}
	*dest = '\0';
	return temp;
}

交流QQ群:

456197310 PC微信HOOK逆向分析

你可能感兴趣的:(C++技术,C#技术)