如何使用 pinvoke 将图像从 c 或 c++ 发送到 C#

Posted

技术标签:

【中文标题】如何使用 pinvoke 将图像从 c 或 c++ 发送到 C#【英文标题】:How to send the image from c or c++ to C# with pinvoke 【发布时间】:2014-02-04 14:02:55 【问题描述】:

如何使用 Pinvoke 将图像文件从 C 或 C++ 发送到 C#,如果可能,请粘贴代码...

来自文件指针或来自 C 的其他指针,以及如何在 C# 端投射和显示图像。

【问题讨论】:

Pinvoke 是一项允许 C# 调用 C 或 C++ 代码的功能。你这样做是错误的。使用 COM 或托管 CLR 让 C++ 程序使用 .NET 代码。 【参考方案1】:

C#/VB 使用位图,所以你必须先转换它。

对于带有“fileapi.h”的 c++

extern "C" __declspec(dllexport) void MyFunct(HANDLE* fileHandle) 

    *fileHandle = CreateFile(MyBitmap, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL);

用于 VB.Net

<System.Runtime.InteropServices.DllImport("MyDll.dll")> _
Public Shared Sub MyFunct(ByRef fileHandle As IntPtr)
End Sub

Sub MyFunction()
    Dim picture As System.Drawing.Image
    Dim sFileHandle As Microsoft.Win32.SafeHandles.SafeFileHandle
    Dim FilePointer As IntPtr
    MyFunct(FilePointer)
    sFileHandle = New Microsoft.Win32.SafeHandles.SafeFileHandle(FilePointer, True)
    picture = Image.FromStream(New System.IO.FileStream(sFileHandle, IO.FileAccess.Read))
End Sub

这是一种不使用 Marshalling 和 PInvoke 的方法,但它“又快又脏”,因此您必须自己处理指针和内存...

【讨论】:

嗨 Beinfreiheit,你能用 C# 编写它吗,我是 C# 新手,我不知道 VB。 嗨,我在图片 = Image.FromStream(New System.IO.FileStream(sFileHandle, IO.FileAccess.Read)) 处遇到异常,它说参数无效.. CreateFile 中的 MyBitmap 是jpg 不是位图...或者你可以告诉我如何在 C++ 中创建 jpg 图像的位图

以上是关于如何使用 pinvoke 将图像从 c 或 c++ 发送到 C#的主要内容,如果未能解决你的问题,请参考以下文章

将带有结构字段的结构从 c++ 返回到 c# pinvoke

如何使用 PInvoke 将 std::wstring 从 C++ 返回到 C# 而无需编写字符串缓冲区转换 [重复]

将字符串从 C++ 传递到 C#

__vectorcall 通过 C++/CLI 或 PInvoke (C#)

IndexOutOfRangeException - 无法使用 PInvoke 查看调用堆栈

如何制作一个 PInvoke 友好的原生 API?