Übernahme VS2013-C++-Projekt in VS2013-CE mit einem Problem



  • In meiner Verzweiflung images aus der der exe (resource.rc) zu holen und in einer picturebox anzuzeigen musste ich nach langem Suchen auf eine Lösung aus dem web zurückgreifen, die in VS2013 tadellos funktioniert (obwohl sie mir ziemlich aufwändig erscheint).

    Bei der probeweisen Übernahme in 2015-CE gibt es gleich 5 Fehler bei einer einzigen Zeile, ich habe keinen Schimmer warum:

    //Create a cli::array of byte with size = total size + 2
    cli::array<BYTE> ^MemPtr = gcnew array<BYTE>(Size + 2);
    

    Hier die Fehler:

    Fehler C2976 "std::array": Nicht genügend template-Argumente.
    Fehler C2726 "gcnew" kann nur zum Erstellen eines Objekts mit verwaltet-Typ verwendet werden
    Fehler C2514 "std::array": Klasse besitzt keine Konstruktoren
    Fehler (aktiv) Es wurde ein Typspezifizierer erwartet.
    Fehler (aktiv) Zu wenig Argumente für "Klassenvorlage "std::array"".

    Hier die komplette Funktion:

    public: Image ^ getImageFromRes(long resource_ID, LPCWSTR module_name)
    	{
    
    		//Load the resource module:
    		HINSTANCE module = LoadLibrary(module_name);
    		if (module == NULL)
    			return nullptr;
    
    		// Find the resource using the resource ID from file "resource.h"
    		//HRSRC rsrc = FindResource(module, MAKEINTRESOURCE(resource_ID), IMAGE_BITMAP);   //original
    		HRSRC rsrc = FindResource(module, MAKEINTRESOURCE(resource_ID), __TEXT("PNG"));    //Typ ist gem. xxx.rc!!
    		if (!rsrc)
    			return nullptr;
    
    		// Load the resource and save the total size.
    		DWORD Size = SizeofResource(module, rsrc);
    		HGLOBAL MemoryHandle = LoadResource(module, rsrc);
    		if (MemoryHandle == NULL)
    			return nullptr;
    
    		//Create a cli::array of byte with size = total size + 2
    		cli::array<BYTE> ^MemPtr = gcnew array<BYTE>(Size + 2);
    
    		//Cast from LPVOID to char *
    		char *lkr = (char *)(LockResource(MemoryHandle));
    
    		//Copy from unmanaged memory to managed array
    		Marshal::Copy((IntPtr)lkr, MemPtr, 0, Size);
    
    		// Create a new MemoryStream with size = MemPtr
    		System::IO::MemoryStream ^stream = gcnew System::IO::MemoryStream(MemPtr);
    
    		//Write in the MemoryStream
    		stream->Write(MemPtr, 0, Size);
    
    		//Set the position for read the stream
    		stream->Position = 0;
    
    		//Free allocated resources
    		FreeLibrary(module);
    
    		//Create an Image abstract class pointer
    		System::Drawing::Image ^ptrJpg;
    
    		//Assign the stream to abstract class pointer
    		ptrJpg = System::Drawing::Image::FromStream(stream);
    		return  ptrJpg;
    	}
    

    Gibts denn keine einfachere Methode images rauszuholen und anzuzeigen, die ich nur nicht gefunden habe?



  • Verdammt, überschrift ist falsch, es muss lauten:

    Übernahme VS2013-C++-Projekt in VS2015-CE mit einem Problem

    Kann das bitte jemand ändern, danke



  • So funktioniert es:

    cli::array<byte> ^MemPtr = gcnew cli::array<byte>(Size + 2);
    

    ... also kleines "byte". Woran liegt das, an der höheren Zielsystem .NET-Frameworkversion 4.5.2? Bei 2013 ist bei mir Zielframework 4.5 eingestellt


Anmelden zum Antworten