|
You last visited: Today at 12:22
Advertisement
Dll Code
Discussion on Dll Code within the C/C++ forum part of the Coders Den category.
05/26/2013, 03:06
|
#1
|
elite*gold: 99
Join Date: Apr 2011
Posts: 730
Received Thanks: 236
|
Dll Code
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);
}
|
|
|
05/26/2013, 12:39
|
#2
|
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
|
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
Padmak
|
|
|
05/26/2013, 13:30
|
#3
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
In deiner Exe willst du den Pointer-Typen die Ergebnisse von GetProcAddress zuweisen. Da sollten logischerweise die Variablennamen stehen.
|
|
|
05/27/2013, 17:52
|
#4
|
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
|
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 ();
}
|
|
|
05/27/2013, 18:43
|
#5
|
elite*gold: 99
Join Date: Apr 2011
Posts: 730
Received Thanks: 236
|
Quote:
Originally Posted by Tasiro
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;
}
zu übersetzen, hast du eine Ahnung warum?
|
|
|
05/27/2013, 19:33
|
#6
|
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
|
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.
Quote:
Ist?
|
|
|
05/27/2013, 20:44
|
#7
|
elite*gold: 99
Join Date: Apr 2011
Posts: 730
Received Thanks: 236
|
Quote:
Originally Posted by Tasiro
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.
Ist?
|
Der Compiler?
|
|
|
05/27/2013, 22:03
|
#8
|
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
|
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.
|
|
|
05/27/2013, 22:32
|
#9
|
elite*gold: 99
Join Date: Apr 2011
Posts: 730
Received Thanks: 236
|
Quote:
Originally Posted by Tasiro
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.
|
|
|
05/27/2013, 22:57
|
#10
|
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
|
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.
|
|
|
05/28/2013, 06:56
|
#11
|
elite*gold: 0
Join Date: Jan 2009
Posts: 1,160
Received Thanks: 232
|
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?
|
|
|
05/28/2013, 10:31
|
#12
|
elite*gold: 99
Join Date: Apr 2011
Posts: 730
Received Thanks: 236
|
Quote:
Originally Posted by Delinquenz
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
|
|
|
All times are GMT +2. The time now is 12:22.
|
|