码迷,mamicode.com
首页 > 编程语言 > 详细

C# 接收C++ dll 可变长字节或者 字符指针 char*

时间:2019-12-21 18:55:06      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:ptr   console   memcpy   div   length   str   nullptr   style   enc   

     网络上查找到的几乎都是 需要提前固定知道 接收字符(字节)数据的大小的方式,现在的数据大小方式 不需要提前知道如下

思路:

1 .C++,返回变长 指针或者字节 的地址给C# 接收,同时返回 该地址的数据长度给C#。

 2 .C# 通过C++ 返回的数据长度,创建接收数据的byte[] 长度。

 3.C# 通过返回的地址 拷贝读取数据。

 

 

C++  代码如下: 

 

extern "C"      __declspec(dllexport)   char  *  GetFileByteArray(wchar_t * BinfilePath, wchar_t *BinfileName,int indexFile, int * length)
 {

       
     char *chBinfilePath= nullptr, *chBinfileName = nullptr;
     wchar_tTranstoChar(BinfilePath, &chBinfilePath);
     wchar_tTranstoChar(BinfileName, &chBinfileName);

     char a[] = "13345zh中文 hello";
        //前提条件需要 返回变长的指针
     int  fileCount = sizeof(a);
        
     char  *att = new char[fileCount];
     memcpy(att, a, fileCount);

     *length = fileCount-1; // C#获得长度 

     free(chBinfilePath);
     free(chBinfileName);
    
     return  att;// C# 获得指针
    
 }

 

C# 处理如下: 

        [DllImport("BASECORELIBRARY.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
        public static extern IntPtr GetFileByteArray(string BinfilePath, string BinfileName, int indexFile,ref  int length);




 int length = 0;
          
            IntPtr piBuf = InvokeDLL.GetFileByteArray(newFilePath, toBinName, 0, ref length);
            
            byte[] arrayBuf = new byte[length];
            Marshal.Copy(piBuf,arrayBuf,0, length);

            string st=  Encoding.Default.GetString(arrayBuf);
            Console.WriteLine(st);

 

输出结果: 13345zh中文 hello            

 

C# 接收C++ dll 可变长字节或者 字符指针 char*

标签:ptr   console   memcpy   div   length   str   nullptr   style   enc   

原文地址:https://www.cnblogs.com/bkyrslf/p/12077637.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!