如何将C ++ DLL中的IStream *传递给C#

时间:2018-03-08 08:28:05

标签: c# c++ dll istream

现在,我调用一个函数,然后返回一个IStream * .in c ++ applicaction,我可以使用Cimage.load(IStream *),然后保存它。它成功了。

但在c#中,我无法获得IStream。

并且iBitMapSize也很短。例如,在c ++中它是34257415.在c#it的342中。 大小是..我从第三方库得到一个图像。类的图像是作者自己定义的。当我使用库函数获取图像时,我将大小的图像提供给iBitMapSize,然后将图像提供给IWICStream,然后将IWICStream提供给IStream *。

c ++应用程序代码:

     typedef IStream*(*GetRegionTile)(const wchar_t* , int64_t , int64_t , float , int64_t , int64_t, uint64_t&);
     GetRegionTile getregiontile = (GetRegionTile)GetProcAddress(hDllInst, "GetRegionTile");
     IStream* stream= getregiontile(filepath, x,y, _zoom, w, h,  iBitMapSize);
     CImage image;
     image.Load(stream);
     LPCTCH savePath= L"D:/123.png";
     image.Save(savePath, Gdiplus::ImageFormatPNG);

c#importdll代码:

     [DllImport("SConver.dll", EntryPoint = "GetRegionTile", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
     public static extern System.Runtime.InteropServices.ComTypes.IStream GetRegionTile(string fileName, long x, long y, float zoom, long w, long h, out uint iBitMapSize);

c#usedll code:

      System.Runtime.InteropServices.ComTypes.IStream stream = Import_DLL.GetRegionTile(file_name, lx, ly, zoom, lw, lh, out iBitMapSize);
      byte[] fileBytes = new byte[iBitMapSize];
      stream.Read(fileBytes, fileBytes.Length, IntPtr.Zero);
      System.IO.MemoryStream ms = new System.IO.MemoryStream(fileBytes);
      System.Drawing.Image image = System.Drawing.Image.FromStream(ms);
      image.Save(@"D:\123.png");

我是一名c#开发人员,对c ++基础并不是特别熟悉。我可能会问基本问题,但非常感谢你的帮助。

0 个答案:

没有答案