?
Ich hab in letzter Zeit ein wenig mit Win32 exceptions gearbeitet und habe mich gewundert ob man die nicht mit den C++ exception combiniren könnte. Ich hab mal gegoogled und bin auf _set_se_translator gestossen.
Der Haken an der Sache ist nun der, dass ich kein VC hab. Ich hab mal mit dem BC5.5 ein wenig herum probiert und da werden catchs konsequent übersprungen (__except klappt aber...).
Ich hab bereits versucht _set_se_translator dynamisch zu laden und zu benutzen, was auch klappt jedoch wird meine translator Funktion nie aufgerufen.
Hier ist was bis jetzt ausprobiert habe:
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<stdexcept>
#include<iostream>
using namespace std;
typedef void (*_se_translator_function)( unsigned int, struct _EXCEPTION_POINTERS* );
_se_translator_function (*_set_se_translator)( _se_translator_function se_trans_func );
HINSTANCE _msvcrt_dll=0;
void _free_set_se_translator(){
FreeLibrary(_msvcrt_dll);
}
void _load_set_se_translator(){
_msvcrt_dll=LoadLibrary ("msvcrt.dll");
if(!_msvcrt_dll)
cout<<"Could not load msvcrt.dll"<<endl;
_set_se_translator=(_se_translator_function (*)( _se_translator_function))GetProcAddress(_msvcrt_dll,"?set_unexpected@@YAP6AXXZP6AXXZ@Z");
if(!_set_se_translator)
cout<<"Could not find ?set_unexpected@@YAP6AXXZP6AXXZ@Z"<<endl;
atexit(_free_set_se_translator);
}
void SEFunc();
void trans_func(unsigned int,EXCEPTION_POINTERS*)
{
cout<<"In trans_func"<<endl;
throw runtime_error("Win32 error");
}
int main( void )
{
try{
_load_set_se_translator();
_set_se_translator(trans_func);
SEFunc();
}catch(exception&err){
cout<<err.what()<<endl;
}
cin.get();
return 0;
}
void SEFunc()
{
__try
{
cout<<"Starting __try"<<endl;
/*int x, y=0;
x = 5 / y;*/
int*x=0;
*x=0;
cout<<"Ending __try"<<endl;
}
__except(EXCEPTION_CONTINUE_SEARCH)
{
cout<<"In except" <<endl;
}
}
PS: Es wäre echt genial wenn jemand auch einen Weg für MinGW kennen würde.