SOLVED: Hab ich eine Referenz vergessen?



  • Hi,

    ich schreibe für C# eine C++ - Dll, mit welcher ich in einem Bitmap ein Bild suchen möchte - ich mache das in c++, weil ich mich mit OpenMP besser auskenne als mit der Parallelisierung in C#.

    Die C++ Funktion macht aktuell noch nicht wirklich etwas, denn die Bitmaps werden nicht korrekt übergeben. Ich habe das aber schon mal gemacht, ich weiß also, dass es gehen müsste. Wenn ich in C++

    mImg.
    

    eingebe, werden mir die Members von HBITMAP garnicht angezeigt. Gehe ich im Debug mit dem Mauszeiger auf mImg so wird mir "unused = {???}" angezeigt. Habe ich irgend eine Header-Datei vergessen?

    Anbei der Code:
    Code C#:

    [System.Runtime.InteropServices.DllImport(@"C:\HomeC\00_DevTest_CS\cppGetSubPicture\FindSubPicture\Debug\FindSubPicture.dll", CharSet = CharSet.Unicode, EntryPoint = "FindSubPictures")]
            private static extern System.IntPtr FindSubPicturesFct(System.IntPtr mImg, System.IntPtr sImg, int* nMatches);
    
            public static System.Collections.Generic.List<TPoint> FindSubPictures(System.Drawing.Bitmap mImg, System.Drawing.Bitmap sImg)
            {
                TPoint* PStack = null;
                int nMatches = 0;
                System.Collections.Generic.List<TPoint> MyList = new System.Collections.Generic.List<TPoint>();
                MyList.Clear();
    
                PStack = (TPoint*)FindSubPicturesFct(mImg.GetHbitmap(), sImg.GetHbitmap(), &nMatches);
                if(PStack == null) { return MyList;}
    
                for (int i = 0; i < nMatches; i++) { MyList.Add(new TPoint(PStack[i].x[0], PStack[i].x[1])); }
                try
                {
                    System.Runtime.InteropServices.Marshal.FreeHGlobal((System.IntPtr)PStack);
                }catch(System.Exception ex) { System.Console.WriteLine(ex.Message); }
    
                return MyList;
            }
    

    Code C++:

    #ifndef FINDSUBPICTURES_H
    #define FINDSUBPICTURES_H
    #include <stdio.h>
    #include <stdlib.h>
    #include <Windows.h>
    #include <omp.h>
    
    struct TPoint
    {
    	int x[2];
    
    	TPoint(int fx, int fy) {
    		x[0] = fx;
    		x[1] = fy;
    	}
    
    	void Reset() { x[0] = 0; x[1] = 0; }
    	void Set(int fx, int fy){x[0] = fx; x[1] = fy;}
    };
    
    extern "C" __declspec(dllexport) TPoint* FindSubPictures(HBITMAP mImg, HBITMAP sImg, int* nMatches) {
    	int mImgWidth = -1, mImgHeight = -1, sImgWidth = -1, sImgHeight = -1;
    	TPoint* MyList = nullptr;
    	if (mImg == nullptr || sImg == nullptr || nMatches == nullptr) { return nullptr; }
    
    	return MyList;
    }
    #endif
    


  • Dieser Thread wurde von Moderator/in Arcoth aus dem Forum C++ (alle ISO-Standards) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • HBITMAP ist nur ein Handle ("void *", s. Windows Data Types). Die ganze WinAPI ist zwar objektorientiert geschrieben, hat aber reine C-Schnittstellen, d.h. du mußt die Funktionen in der MSDN nachschauen: Bitmap Functions.

    Edit: Wenn es dir um Bildverarbeitung geht, würde ich OpenCV nehmen - und hiervon gibt es auch einen .NET-Wrapper: OpenCvSharp



  • Vielen Dank, das war es.

    Ich kann das HBITMAP nicht, aber das BITMAP bearbeiten.
    Dazu muss ich einfach folgendes ausführen:

    BITMAP mBMP = nullptr;
    GetObject(mImg, sizeof(BITMAP), &mBMP);
    

Anmelden zum Antworten