Teile von SDK ins Programm reinladen (oder Teile von SDK beim Anwender installieren) und noch char* freigaben
-
Hallo,
ich kommentiere immer alles heraus und lass nur eine Funktion uebrig. Wenn ich diese Funktion (die letzte) in eine void-Rueckgabetyp-Funktion aendere, dann steigt der Speicher nicht. Wenn ich das aber wieder in int umaendere dann steigt der Speicher wieder.
Wie gesagt, das Problem liegt irgendwo hier.Noch als Info. So rufe ich die Funktion auf. Jetzt mal egal mit was fuer Parameter. Und egal was fuer ein Rueckgabetyp, hier hab jetzt einfach mal int genommen.
#include <windows.h> #include <iostream> #include "tchar.h" typedef int (*getVersion)(void); int main() { HINSTANCE DLL = LoadLibrary(_T("DLL.dll")); if(DLL) { for (int i = 0; i < 4000000000; i++) { getVersion temp3; temp3 = (getVersion)GetProcAddress(DLL, "getVersion"); std::cout << temp3() /*<< " " << i */<< std::endl; } } return 0; }
Hast du noch Ideen?
Ich Danke so oder so fuer deine Hilfe. Gruesse.
-
Hat eigentlich hier kein anderer eine Idee?
Gruesse.
-
Was macht die Funktion "getVersion" genau?
Poste mal bitte ein *vollständiges* Beispiel und nicht immer nur ganz verschiedene Code-Schnipsel...
-
Ach komm schon.
Ein wenig mitdenken waere schon hilfreich.Die Funktion findest du in den Post weiter oben.
-
Guten Morgen,
ich habe jetzt mal dieses Package installiert:
"Microsoft Visual C++ 2005 SP1 Redistributable Package (x86)" und dieses "Microsoft Visual C++ 2005 Redistributable Package (x86)" hat aber nichts gebracht.
Noch weitere Ideen?Hochachtungsvoll
h.peter
-
h.peter schrieb:
Ach komm schon.
Ein wenig mitdenken waere schon hilfreich.Die Funktion findest du in den Post weiter oben.
Du willst doch ne Lösung von uns haben, also liegt es an Dir, die Informationen so zu liefern das Dir jemand helfen will. Oder meinst Du, wir warten hier den ganzen Tag auf Posts weil die Kreuzworträtsel alle sind ?
Was die "ich installiere dies und das" bringen soll weiß ich nicht. Du könntest die Zeit eher dafür verwenden, Dein Problem mal strukturiert zu Posten.
Was EinNamespace::EineKlasse::getVersion(int) treibt ist aus Deinem Quellcode nicht zu erkennen. Man sieht ja nicht mal den Rückgabetyp. Den kann man bestenfalls erraten in dem reinterpretcast und Ansi C Funktionsgewirr.
-
Du willst doch ne Lösung von uns haben, also liegt es an Dir
Ich habe es langsam so satt ... in jedem Forum gibt es irgend jemand der einfach nur blabla sagen kann. In manchen Foren soll man nicht alles doppelt posten und in machen
also liegt es an Dir, die Informationen so zu liefern das Dir jemand helfen will
Was soll daran so schlimm sein, jemand darauf hinzuweisen das der post oben schon die Antwort auf seine frage ist.
Oder meinst Du, wir warten hier den ganzen Tag auf Posts weil die Kreuzworträtsel alle sind?
Ich habe schon im ersten Post das hier gesagt:
Ich danke jedem der sich Muehe gibt mir zu Helfen. Danke. Ich weiss das es eure Privatzeit ist und genau aus diesem Grund nehme ich den Hut ab.
Waere nett wenn du alles lesen wuerdest. Wer natuerlich nur den letzten Post liest, bekommt das in den falschen Hals. Entschuldigung hierfuer.
Was EinNamespace::EineKlasse::getVersion(int) treibt ist aus Deinem Quellcode nicht zu erkennen
Bis du eigentlich ein Programmierer?
Man sieht ja nicht mal den Rückgabetyp
Versteh ich nicht. Wo sieht man den Rueckgabetyp nicht.
In dieser Zeile hier:
extern "C" __declspec(dllexport) int getVersion (int Id)
seh ich ein Rueckgabetyp. Wenn du kein siehst, dann kannst du mir auch nicht weiterhelfen.Wer das in den falschen Hals bekommt: Entschuldigung. Meine restlichen Beitraege sind meiner Meinung nach immer hoeflich gewesen und ich habe mich auch fast immer bedankt. Des weiteren habe ich am Anfang gesagt, das ich versuchen werde das so verstaendlich wie moeglich zu machen. Also hier nochmal:
Ich habe hier eine Funktion in einer DLL:
/////// Eine Funktion in der DLL ////////// //Die Funktion liefert einen int-Wert zurueck. (Diesmal ohne Parameterannahme, damit es einfach einfach bleibt. :)) //Rueckgabetyp //Header der Funktion | extern "C" __declspec(dllexport) int getVersion () { //Ein Objekt erstellen, die Klasse liegt in einer '.netmodule'-Datei EinNamespace::EineKlasse ^cl = gcnew EinNamespace::EineKlasse(); //einen Zeiger auf das Ergebnis des Funktionsaufrufes ueber das Objekt //Funktionsaufruf ueber das Objekt System::IntPtr pointer = System::Runtime::InteropServices::Marshal::StringToHGlobalAuto( cl->getVersion() ); //Wir erstellen einen char-Zeiger und weisen auf die Position auf dem der pointer zeigt. char* temp = (char*)(void*)pointer; //das ganze wird in ein int umgewandelt int tmp2 = atoi(temp); ////// Speicher wird freigegeben ////// //Der Speicherplatz des dynamisch erstelltem Objekts, wird freigegeben delete cl; //Der pointer muss auch freigegeben werden. System::Runtime::InteropServices::Marshal::FreeHGlobal(pointer); //Rueckgabe des int-wertes return tmp2; }
Nun gibt es noch ein Projekt was das ganze aufruft.
/////////// Hauptprogramm ///////////// #include <windows.h> #include <iostream> #include "tchar.h" typedef int (*getVersion)(void); int main() { //DLL einbinden HINSTANCE DLL = LoadLibrary(_T("DLL.dll")); //wenn DLL auch da ist ... if(DLL) { //diese Schleife ist dafuer da, um zu ueberpruefen ob der Speicher voll wird oder nicht for (int i = 0; i < 4000000000; i++) { //variable fuer die entgegennahme des rueckgabetyps getVersion temp3; //wie ein aufruf ueber eine DLL funktioniert erklaer ich jetzt nicht, @Knuddlbaer: sorry temp3 = (getVersion)GetProcAddress(DLL, "getVersion"); //ausgabe des int-wertes und evtl. die schleifendurchlaeufe std::cout << temp3() /*<< " " << i */<< std::endl; } } //rueckgabewert fuer die main-funktion return 0; }
Das Hauptprogramm hab ich euch erneut komplett zugesendet und in der DLL steht (wie schon gesagt) nur die eine Funktion (rest ist auskommentiert).
Noch irgendwelche Fragen? Fragt einfach, wenn was sein sollte.
Ich danke fuer jede Hilfe. Danke.
Gruesse
h.peter
-
extern "C" __declspec(dllexport) int getVersion () { // Eine Managed Klasse erzeugen, über die mal rein garnichts bekannt ist, // Vorallem nicht, ob diese Klasse vllt. irgendwo etwas verwendet, das // native Speicher reserviert EinNamespace::EineKlasse ^cl = gcnew EinNamespace::EineKlasse(); // Den unbekannten Rückgabetyp von cl->getVersion in einen nicht verwalteten Speicher kopieren. // Ob dieser nun ANSI oder UNICODE sein wird, ist an dieser Stelle unbekannt. System::IntPtr pointer = System::Runtime::InteropServices::Marshal::StringToHGlobalAuto( cl->getVersion() ); // Das Ergebnis mittels reinterpret_cast einfach in ein char* pointer murksen. char* temp = (char*)(void*)pointer; //das ganze wird in ein int umgewandelt int tmp2 = atoi(temp); //Der Speicherplatz des dynamisch erstelltem Objekts, wird freigegeben delete cl; //Der pointer muss auch freigegeben werden. System::Runtime::InteropServices::Marshal::FreeHGlobal(pointer); //Rueckgabe des int-wertes return tmp2; } // Das ganze wäre vllt. mein einem System::Int32::Parse einfacher zu lösen
-
h.peter schrieb:
Ich habe es langsam so satt ... in jedem Forum gibt es irgend jemand der einfach nur blabla sagen kann.
Stimmt. Manchmal ist ein aufstossen aber Notwendig. Was Du Postest ist einfach nur Chaos. Lies Dir Deine Beiträge hier in diesem Thread durch und überlege welche Informationen bereitgestellt wurden.
Was soll daran so schlimm sein, jemand darauf hinzuweisen das der post oben schon die Antwort auf seine frage ist.
Was ist daran so schlimm gefragt zu werden was der Rückgabewert einer Methode ist, die innerhalb der geposteten verwendet wird ?
Waere nett wenn du alles lesen wuerdest. Wer natuerlich nur den letzten Post liest, bekommt das in den falschen Hals. Entschuldigung hierfuer.
Dito - würdest Du lesen können, hättest Du bereits viele wertvolle Tips aufgeschnappt. Du kannst aber gerne weiterhin einfach Sinnlos Installationspakete auf den Rechnern laufen lassen.
Was EinNamespace::EineKlasse::getVersion(int) treibt ist aus Deinem Quellcode nicht zu erkennen
Bis du eigentlich ein Programmierer?
Wann ist man denn Programmierer ? Meine Kentnisse reichen aus um zu erkennen, das für EinNamespace::EineKlasse::getVersion keine Signatur gepostet wurde.
In dieser Zeile hier:
extern "C" __declspec(dllexport) int getVersion (int Id)
seh ich ein Rueckgabetyp. Wenn du kein siehst, dann kannst du mir auch nicht weiterhelfen.Reichen Deine Kentnisse um den Zusammehnang zwischen
EinNamespace::EineKlasse::getVersion
,
extern "C" __declspec(dllexport) int getVersion ()
und
Was EinNamespace::EineKlasse::getVersion(int) treibt ist aus Deinem Quellcode nicht zu erkennen. Man sieht ja nicht mal den Rückgabetyp.
zu erkennen ?
-
Hallo,
ich habe hier jetzt mal den noetigen Quelltext von der '.netmodule'-Datei besorgt.
using System.Text; using System.Runtime.InteropServices; using System; namespace EinNamespace { public class EineKlasse : IDisposable { [DllImport("API.dll")] private static extern int getVersion(); public string getDLLVersion() { return getStrFromPtr(getVersion()); } } }
Danke und Gruesse