Programmaufruf aus eigenem Programm
-
selber schuld, wenn du in nem eigenen post eine editierung nach 20 minuten machst!
hier mal der code fuer eine unit error.cpp (inkl. header). hier wird eine funktion Error() und LastError()) definiert. Error() ermoeglicht die Erzeugung ein Fehler-Messagebox mit Angabe fuer Caption und Text. Die Ausgabe erfolgt ueber einen selbstdefinierten Error-Handler. LastError() liefert dir die formatierte Fehlermeldung von Windows-GetLastError(), d.h. aus dem Errorcode den WinAPI-Funktionen zurueckgeben, wird eine lesbare Fehlermeldung generiert.
// error.h
//--------------------------------------------------------------------------- #ifndef __RS_ERROR_H #define __RS_ERROR_H //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- #include <stdio.h> // für sprintf, vsprintf #include <stdarg.h> // für va_list //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- typedef void (*ErrorHandler) (const char*, const char*, va_list); //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // globale Funktionen und Variablen //--------------------------------------------------------------------------- extern "C" void Error(const char *Module, const char *Format, ...); extern "C" void LastError(const char *Module); //--------------------------------------------------------------------------- extern "C" ErrorHandler SetErrorHandler(ErrorHandler); extern "C" ErrorHandler _ErrorHandler; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- #endif //---------------------------------------------------------------------------// error.cpp
//--------------------------------------------------------------------------- #include <windows.hpp> // für MessageBox //--------------------------------------------------------------------------- #include "Error.h" //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // Error-Handler für Programm //--------------------------------------------------------------------------- void MyErrorHandler(const char *Module, const char *Format, va_list ArgPtr) { char Caption[ 255]; char Message[3072]; if (!Module) sprintf(Caption, "%s", "Error"); else sprintf(Caption, "%s", Module); vsprintf(Message, Format, ArgPtr); MessageBox(GetFocus(), Message, Caption, MB_OK | MB_ICONERROR | MB_TOPMOST | MB_TASKMODAL); } //--------------------------------------------------------------------------- // Standard-Error-Handler festsetzen //--------------------------------------------------------------------------- ErrorHandler _ErrorHandler = MyErrorHandler; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // Funktion setzt den Error-Handler //--------------------------------------------------------------------------- ErrorHandler SetErrorHandler(ErrorHandler Handler) { ErrorHandler Prev = _ErrorHandler; _ErrorHandler = Handler; return Prev; } //--------------------------------------------------------------------------- // Funktion formatiert die Meldung und übergibt sie // dem festgelegten Error-Handler //--------------------------------------------------------------------------- void Error(const char *Module, const char *Format, ...) { if (_ErrorHandler) { va_list ArgPtr; va_start(ArgPtr, Format); (*_ErrorHandler) (Module, Format, ArgPtr); va_end(ArgPtr); } } //--------------------------------------------------------------------------- // Funktion erzeugt eine Fehlermeldung von GetLastError und // übergibt sie dem festgelegten Error-Handler //--------------------------------------------------------------------------- void LastError(const char *Module) { LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, 0); (*_ErrorHandler) (Module, (LPCTSTR) lpMsgBuf, 0); // Speicher freigeben LocalFree(lpMsgBuf); }Aufrufe ueber:
void FunktionBlahBlah() { DWORD Result = ShellExecute(...); // Fehlermeldungen von ShellExecute ausgeben if (Result <= 32) LastError("FunktionBlahBlah"); }ich hoffe ich habe nichts vergessen zu kopieren.
-
Mensch ganz schon viel Quellcode naja muss ich mich halt mal durchfrimeln.
Eine Frage die ich mir noch nicht selber beantworten konnte:
Was verstehe ich unter dem Variablen Typ WORD und DWORD und wo setzt man diese ein?
-
Hallo
WORD ist ein 16-bit Wert, DWORD ein 32-bit Wert.
In dieser Form wird es in der WinAPI definiert. Deshalb wird es bei WinAPI-Zugriff gebraucht, meistens DWORD als typedef auf einen int.bis bald
akari
-
Noch eine Methode:
http://www.marquardtnet.info/cecke/quickies.1/1_quicky_25.html
-
akari schrieb:
DWORD als typedef auf einen int.
nicht ganz.
korrekt ist das so definiert:
typedef unsigned long DWORD; typedef unsigned short WORD;
-
Na ja, unsígned long ist doch auch ein int.

-
@Sunday
Ich blicke auch nach genauem hinsehen nicht durch den Quelltext durch. Würde es dir Umstände machen mir deinen oben geposteten Quellcode zu erklären. Wir können das auch Privat per ICQ und PN regeln wenn du willst.Und noch eine spezielle Frage an alle:
Extern "C" kenn ich nicht ws bedeutet dieser Befehl?
-
Extern "c" verhinder das die Namen der Funktionen verändert werden
-
Wie die Namen der Funktionen verändern, wann geht es denn überhaupt und wie macht man das??? Naja aber könnte sich nich einer hier erbarmen und mir den Quellcode oben von Sunday erklären, ich blicke da nicht so ganz durch.
-
Einfache suche bei google:
-
Danke extern c habe ich jetzt verstanden, wieder weis ich ein bisschen mehr, aber den Quellcode will mir anscheinend wirklich keiner verständlich machen. Naja ist auch ganz schön viel Arbeit bei so einem Text, aber vielleicht findet sich ja doch noch jemand.