Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将位图从C#传递到C++;非托管代码 我尝试在C语言中编写代码,将位图传递给非托管C++ DLL并返回点结构。_C#_C++_Unmanaged_Dllexport_Hbitmap - Fatal编程技术网

将位图从C#传递到C++;非托管代码 我尝试在C语言中编写代码,将位图传递给非托管C++ DLL并返回点结构。

将位图从C#传递到C++;非托管代码 我尝试在C语言中编写代码,将位图传递给非托管C++ DLL并返回点结构。,c#,c++,unmanaged,dllexport,hbitmap,C#,C++,Unmanaged,Dllexport,Hbitmap,我在互联网上做了很多研究,但没有找到帮助我解决问题的“Gotcha”文章或代码 我迄今为止所能想到的最好的是一个非托管C++ DLL,它包有一个托管C++的DLL,由我的C++应用程序调用。在测试过程中,我可以传递简单的类型,比如整数,然后返回一个整数。现在我要讨论的问题是位图 我曾尝试传递HBITMAP(使用c#中位图的GetHBitmap()函数),但在编译“无法将参数1从'System::IntPtr'转换为'HBITMAP'”和“Class1.FindImage(void*,void*)

我在互联网上做了很多研究,但没有找到帮助我解决问题的“Gotcha”文章或代码

<>我迄今为止所能想到的最好的是一个非托管C++ DLL,它包有一个托管C++的DLL,由我的C++应用程序调用。在测试过程中,我可以传递简单的类型,比如整数,然后返回一个整数。现在我要讨论的问题是位图

我曾尝试传递HBITMAP(使用c#中位图的GetHBitmap()函数),但在编译“无法将参数1从'System::IntPtr'转换为'HBITMAP'”和“Class1.FindImage(void*,void*)由于其保护级别而无法访问”时出错

以下是我的一些代码:

主应用程序:

class Program
{
    [StructLayout(LayoutKind.Sequential)]
    public struct POINT
    {
        public int X;
        public int Y;

        public POINT(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }

        public static implicit operator System.Drawing.Point(POINT p)
        {
            return new System.Drawing.Point(p.X, p.Y);
        }

        public static implicit operator POINT(System.Drawing.Point p)
        {
            return new POINT(p.X, p.Y);
        }
    }

    static void Main(string[] args)
    {
        Image src = Image.FromFile("Pin.png");
        Image tgt = Image.FromFile("screen.png");

        Bitmap bsrc = new Bitmap(src);
        Bitmap btgt = new Bitmap(tgt);

        IntPtr bs = bsrc.GetHbitmap();
        IntPtr bt = btgt.GetHbitmap();

        POINT p = Class1.FindImage(bs, bt);
    }
}
ImportRap.h:

namespace ImportWrap {

public ref class Class1
{
public:
    static POINT FindImage(IntPtr source, IntPtr target);
};
}
ImportWrap.cpp:

static POINT FindImage(IntPtr source, IntPtr target)
{
return ImgFuncs::MyImgFuncs::FindImage(source, target);
}
ImgFuncs.h

typedef long LONG;
typedef void *PVOID;
typedef PVOID HANDLE;
typedef HANDLE HBITMAP;

typedef struct tagPOINT {
  LONG x;
  LONG y;
} POINT, *PPOINT;

namespace ImgFuncs
{

    class MyImgFuncs
    {
    public:
        static __declspec(dllexport) POINT FindImage(HBITMAP source, HBITMAP target);
    };
}
ImgFuncs.cpp

namespace ImgFuncs
{
POINT MyImgFuncs::FindImage(HBITMAP source, HBITMAP target)
{
    POINT p;

    p.x = 1;
    p.y = 2;
    return p;
}
}
我做错了什么,或者我的方法完全偏离了地图? 我很乐意接受任何关于如何正确编码我正在尝试做的事情的建议。 我有一些C++代码,用于在另一个图像中找到一个工作速度相当快的图像。不幸的是,即使在c#中使用锁位,速度也不够快。所以我想利用C++代码进行图像搜索。
我相信我会遇到更多的障碍,但如果我能越过这个绊脚石的话,我也许能够处理它。正如你所看到的,我的C++知识是有限的。

< P>你可以完全跳过托管C++包装,只需通过p/Unjk调用C语言中的非托管DLL。把这样的东西放在你的C#类中


我还没有对此进行测试,因此您可能需要根据需要对其进行调整,但这是一般的想法。

您不能使用本机结构类型作为返回值,C#无法处理它们。从IntPtr到HBITMAP的转换需要双重转换。像这样:

static System::Drawing::Point FindImage(IntPtr source, IntPtr target)
{
    POINT retval = ImgFuncs::MyImgFuncs::FindImage((HBITMAP)(void*)source, (HBITMAP)(void*)target);
    return System::Drawing::Point(retval.X, retval.Y);
}

将部件参照添加到System.Drawing。你可能还想考虑通过一个位图而不是一个ItPtR来让它更容易使用。

在<代码>中声明的函数SuxTrrAP.CPP是不正确的。不能将
IntPtr
(传入函数)隐式转换为
HBITMAP
类型(函数尝试将其传递给它调用的其他函数)。
static System::Drawing::Point FindImage(IntPtr source, IntPtr target)
{
    POINT retval = ImgFuncs::MyImgFuncs::FindImage((HBITMAP)(void*)source, (HBITMAP)(void*)target);
    return System::Drawing::Point(retval.X, retval.Y);
}