Ü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