Hejo, hab gerade ein bisschen mit Dlls rumgespielt und versucht functions die in einer Dll sind in meiner exe aufzurufen und wollte einfach mal fragen wie man das vielleicht noch besser machen könnte, manche Sachen sind da sicher nicht so gut gelöst / unnötig.
Einmal die main.h der Dll:
Code:
#ifndef __MAIN_H__
#define __MAIN_H__
#endif
#include <Windows.h>
#define DLL_EXPORT __declspec(dllexport)
#ifdef __cplusplus
extern "C"
{
#endif
int DLL_EXPORT Testfunction(int x);
int DLL_EXPORT Rechnen(int i, int y);
int DLL_EXPORT Ausgeben();
#ifdef __cplusplus
}
#endif
Einmal die Quelle.cpp der Dll
Code:
#include "main.h"
#include <iostream>
int DLL_EXPORT Testfunction(int x = 0){
MessageBox(0,"lololowwwwwwwwwwwl", "wqgqwwwwwgq", MB_OK |MB_ICONINFORMATION);
return x;
}
int DLL_EXPORT Rechnen(int i, int y){
int z = i + y;
return z;
}
int DLL_EXPORT Ausgeben(){
std::cout << "test";
return 1;
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason)
{return 1;}
Und einmal die exe an sich
Code:
#include <iostream>
#include <Windows.h>
using namespace std;
typedef int (*Testfunction)(int);
typedef int (*Rechnen)(int, int);
typedef int (*Ausgeben)();
HINSTANCE hinstDLL;
int main(){
Testfunction MsgBox(0) ;
Rechnen MsgBox2(0) ;
Ausgeben MsgBox3(0 ) ;
hinstDLL = LoadLibrary("RealDLL.dll");
if (hinstDLL != 0)
{
Testfunction= (Testfunction) GetProcAddress(hinstDLL, "Testfunction");
Rechnen = (Rechnen) GetProcAddress(hinstDLL, "Rechnen");
Ausgeben = (Ausgeben) GetProcAddress(hinstDLL, "Ausgeben");
}
if (Testfunction== 0 ) cout << "Message Box failed";
int AusgabeNumeroUno = Testfunction(5);
int AusgabeNumeroDuo = Rechnen (5,2);
int AusgabeNumeroTres = Ausgeben ();
if ( AusgabeNumeroUno == 5 )
{
cout << "Message displayed!" << AusgabeNumeroDuo << AusgabeNumeroTres << endl;
}
Sleep(10000);
FreeLibrary(hinstDLL);
}
Beim Erstellen der DLL müsste dir auch eine *.lib-Datei erstellt worden sein, nimm einfach deinen Header, diesmal aber mit __declspec(dllimport) und mach dem Programm damit die Funktionen bekannt, hau die *.lib-Datei in die Abhängigkeiten und compile das. Wenn du dann die DLL in das Verzeichnis der EXE haust, müsste das funktionieren
Außer du bestehst auf das dynamische Laden per LL
Variablen in Funktionen gleich mit richtigen Werten initialisieren! Der ganze Rest (wie globale Variablen oder Absturz ohne RealDLL.dll) sind nicht so wichtig.
Code:
#include <iostream>
#include <Windows.h>
int main () {
using std::cout;
using std::endl;
typedef int (__stdcall * Testfunction) (int);
typedef int (__stdcall * Rechnen) (int, int);
typedef int (__stdcall * Ausgeben) ();
HMODULE hinstDLL = LoadLibrary ("RealDLL.dll");
if (! hinstDLL) {
cout << "Message Box failed";
cin.get ();
return 1;
}
Testfunction MsgBox = reinterpret_cast <Testfunction> (GetProcAddress (hinstDLL, "Testfunction"));
Rechnen MsgBox2 = reinterpret_cast <Rechnen> (GetProcAddress (hinstDLL, "Rechnen"));
Ausgeben MsgBox3 = reinterpret_cast <Ausgeben> (GetProcAddress (hinstDLL, "Ausgeben"));
int AusgabeNumeroUno = MsgBox (5);
int AusgabeNumeroDuo = MsgBox2 (5, 2);
int AusgabeNumeroTres = MsgBox3 ();
if (AusgabeNumeroUno == 5)
//stdout ist normalerweise nicht oder nur zeilenweise gepuffert
cout << "Message displayed!\n"
<< AusgabeNumeroDuo << '\n'
<< AusgabeNumeroTres << '\n';
FreeLibrary (hinstDLL);
cin.get ();
}
Variablen in Funktionen gleich mit richtigen Werten initialisieren! Der ganze Rest (globale Variablen, Absturz ohne RealDLL.dll,
Code:
#include <iostream>
#include <Windows.h>
int main () {
using std::cout;
using std::endl;
typedef int (__stdcall * Testfunction) (int);
typedef int (__stdcall * Rechnen) (int, int);
typedef int (__stdcall * Ausgeben) ();
HMODULE hinstDLL = LoadLibrary ("RealDLL.dll");
if (! hinstDLL) {
cout << "Message Box failed";
cin.get ();
return 1;
}
Testfunction MsgBox = reinterpret_cast <Testfunction> (GetProcAddress (hinstDLL, "Testfunction"));
Rechnen MsgBox2 = reinterpret_cast <Rechnen> (GetProcAddress (hinstDLL, "Rechnen"));
Ausgeben MsgBox3 = reinterpret_cast <Ausgeben> (GetProcAddress (hinstDLL, "Ausgeben"));
int AusgabeNumeroUno = MsgBox (5);
int AusgabeNumeroDuo = MsgBox2 (5, 2);
int AusgabeNumeroTres = MsgBox3 ();
if (AusgabeNumeroUno == 5)
//stdout ist normalerweise nicht oder nur zeilenweise gepuffert
cout << "Message displayed!\n"
<< AusgabeNumeroDuo << '\n'
<< AusgabeNumeroTres << '\n';
FreeLibrary (hinstDLL);
cin.get ();
}
Hm dein Code ruft gefühlte over 9000 exceptions aus, unbehandelter Zuggriff etc. , kanns mir aber nicht erklären, sieht eigentlich richtig aus, die Messagebox gibt er noch an aber er hat laut anzeige ein Problem das return x von
Code:
int DLL_EXPORT Testfunction(int x = 0){
MessageBox(0,"lololowwwwwwwwwwwl", "wqgqwwwwwgq", MB_OK |MB_ICONINFORMATION);
return x;
}
Scheint, als habe ich vergessen, zuende zu schreiben...
Quote:
Originally Posted by Hiris
Hm dein Code ruft gefühlte over 9000 exceptions aus [...]
Ich komme nur auf einen, den beim Absturz. Davon abgesehen ist das beinahe eine exakte Kopie von dem, was da ganz am Anfang dieses Themas steht, gleich im ersten Beitrag, dort im dritten Code-Block.
Scheint, als habe ich vergessen, zuende zu schreiben...
Ich komme nur auf einen, den beim Absturz. Davon abgesehen ist das beinahe eine exakte Kopie von dem, was da ganz am Anfang dieses Themas steht, gleich im ersten Beitrag, dort im dritten Code-Block.
Der Compiler hat Probleme, eine bestimmte Anweisung auszuführen? Das kann doch gar nicht sein! Der Compiler sollte nur eines ausführen: Programme zur Berechnung der Konstanten bei der Konstantenfaltung. Ich kann dein Problem leider nicht nachvollziehen.
Der Compiler hat Probleme, eine bestimmte Anweisung auszuführen? Das kann doch gar nicht sein! Der Compiler sollte nur eines ausführen: Programme zur Berechnung der Konstanten bei der Konstantenfaltung. Ich kann dein Problem leider nicht nachvollziehen.
Auf die Gefahr hin eine Verwarnung zu bekommen, frage ich dich mal ob du mich verarschen willst oder einfach nur verhindert bist?
Sollte letzteres zutreffen, hier haste Wikipedia:
Code:
Ein Compiler (auch Kompiler; von englisch für zusammentragen bzw. lateinisch compilare ‚aufhäufen‘) ist ein Computerprogramm, welches ein (anderes) Programm, das in einer bestimmten Programmiersprache geschrieben ist, in eine Form übersetzt, die von einem Computer, d. h. von dessen Prozessor, ausgeführt werden kann.
Ein Compiler ist ein Programm, welches ein Programm von einer Quellsprache in eine Zielsprache übersetzt, nicht mehr und nicht weniger. In diesem Zusammenhang wird unterschieden zwischen Laufzeit und Kompilierzeit; Laufzeit ist während der Ausführung eines (übersetzten) Programmes, Kompilierzeit ist während der Laufzeit eines Compilers.
Bei der Codeoptimierung kann zur Konstantenfaltung eine Konstante mithilfe eines weiteren Programmes berechnet werden, welches der Compiler aufgrund der Definition der Konstante erstellt. Damit ist der Compiler unabhängig von dem Betriebssystem und muss nicht selbst Ausdrücke auswerten können, dadurch muss der Compiler nicht so groß sein.
Ich nehme dies als Grundlage. Ich verstehe nicht, was du sagen wolltest; ich bitte dich, kläre mich auf.
Der Compiler hat ein Problem wollte Hiris dir sagen. Einfach das "er" durch "der Compiler" ersetzen und der Satz ergibt erstaunlicherweise einen Sinn - LOLOLOLOLOL!
Hiris, schau dir einfach irgendeine C++-Library an. Da du in deinem Post ja nichts von dynamisch laden geschrieben hast, denke ich einfach mal, dass dir das egal ist?
Der Compiler hat ein Problem wollte Hiris dir sagen. Einfach das "er" durch "der Compiler" ersetzen und der Satz ergibt erstaunlicherweise einen Sinn - LOLOLOLOLOL!
Hiris, schau dir einfach irgendeine C++-Library an. Da du in deinem Post ja nichts von dynamisch laden geschrieben hast, denke ich einfach mal, dass dir das egal ist?
Ne das passt alles, sein "verbesserter" Code throwt nur an der return stelle der ersten function eine exception, führt die message box etc. aber noch aus, was ich nicht ganz nachvollziehen konnte, aber ist auch egal, ich machs jetzt einfach so wie Padmak es meinte, ist deutlich schöner und angenehmer
[GAMESCOM-SHOP] Vindictus Code, FireFall BETA Code, McGame.com Code, Victory Ukash 10/18/2012 - elite*gold Trading - 8 Replies Hallo Leute hab ein paar Sachen auf der Gamescom gesammelt und übrig, diese möchte ich hier verkaufen.
Ich akzeptiere nur Paypal, E*gold und Paysafecards!
Hier ist eine Liste mit Bildern (natürlich sind die Codes zensiert :D):
1. Firefall Beta KEY Ihr macht den Preis!
Bild
2. Vindictus Code 50 e*gold
Bild
used king Rammus code OR katarina kitty cat code (KR) → used PAX sivir code (NA / EU) 08/21/2012 - League of Legends Trading - 1 Replies your "already used in the NA / EU servers is Pax Sivir Code"
Do you have?
Want to exchange "Pax Sivir Code"
I "king Rammus code OR Katarina kitty cat code" will provide
I use this code in the NA / EU servers did not.
just. South Korea on a server, you should not use Pax Sivir Code.
If you are interested in this deal, contact me.
e-mail: [email protected]
used king Rammus code OR katarina kitty cat code (KR) → used PAX sivir code (NA / EU) 08/20/2012 - League of Legends Trading - 0 Replies Hello Korea is my server users.
I NA / EU servers have already been used in the "Pax Sivir Code" wants
As a reward, "king Rammus code OR Katarina kitty cat code"
I will send you to gift.
Have already used the code,
Feel free to do the exchange!
Please send mail
[email protected]