Odwolanie do bledow wywolanych z drugiej DLL-ki

0

Witam,

Mam zrobiony program ktory ma dwie funkcje:

  1. pierwsza ('Func1') uruchamia inna DLL-ke (a dokladniej za pomoca 'LoadLibraryEx' uruchamiam funkcje o nazwie 'Func2') ktora przerabia plik. DLL-ka ta ma obsluge bledow: np. w razie zlej tresci lub zlej nazwy pliku, itp. wypluwa blad.

Moja 'Func1' doklada dane do pliku i jezeli cos pojdzie nie tak rowniez wypluwa blad.
Wszystko jest objete 'try' i 'catch':

Func1(...)
{
            try
            {
            //uruchamiam funkcje 'Func2' z DLL-ki, ktora przerabia plik na inny (m.in. zmienia rozszerzenie). Jezeli cos pojdzie nie tak przypisuje blad do enum 'giError' i 'Func2' zwraca flage bledu FALSE. Jezeli wszystko ok to zwraca TRUE.
            //...........
            //'throw' jezeli jakis blad w 'Func1'
            //...........

            }
            catch (runtime_error &ex)
	{
		giError = ERROR_TRANSFORMFILE;
		gsError = ex.what();
		return FALSE;
	}
	catch (exception &ex)
	{
		giError = ERROR_TRANSFORMFILE;
		gsError = ex.what();
		return FALSE;
	}
	catch (...)
	{
		gsError = "Unknown error";
		return FALSE;
	}
	
	//Jezeli wszystko ok
	return TRUE;
}
  1. druga ('GetMessageError') obluguje wyplute bledy.
GetMessageError(..)
{

            //uruchamiam funkcje 'GetMessageError2' z DLL-ki, ktora powinna obsluzyc bledy powstale w 'Func2' jezeli zwrocila ona FALSE

            //ponizej oblsuga bledow powstalych w 'Func1'
	switch (giError)
	{
	case   ERROR_TRANSFORMFILE:
	/* gsError juz ustawione w 'Func1' */
		break;

	case ERROR_RENAMEFILE:
               gsError = "Can't rename file." + gsError;
			break;
		
	case PGSM_ERROR_INP_REMOVEFILE:
	gsError = "Can't remove file." + gsError;
			break;
		
	default:
             gsError = ERR_MSG_UNKNOWN;
			break;
}

Problem moj polega na tym ze program nie przechwytuje bledow powstalych w DLL-ce.

Na przyklad jezeli mam zle dane (np za dluga linijka) w pliku ktory powinien zostac przetworzony przez 'Funk2'. Wyskakuje wtedy Blad krytyczny bez stringu wypisujacego wiadomosc o bledzie z wnetrza funcji 'Funk2' a dokladniej z 'GetMessageError2', nastepnie program sie zamyka.

Nie mam pomyslu jak wszystko poustawiac po kolei zeby moj program przechwytywal bledy powstle w DLL-ce. Prosze o pomoc...

0

No wszystko fajnie, ale za bardzo poobcinałeś ten kod.
Gdzie jest ta fun2? jak ją wywołujesz? Jak radzisz sobie z lądowaniem dllki i obsługą wyjątku?
A co to jest w ogóle to: GetMessageError2?

0

'Func2' jest to jedna z funkcji w Dll. GetMsgError rowniez, odpalam je za pomoca:

                  //.......
                  HINSTANCE gHand;

                  strcat(buffer_module, "INP2.dll"); //buffer module to sciezka do dll
			
	     gHand = LoadLibraryEx((LPCTSTR)buffer_module, NULL, DONT_RESOLVE_DLL_REFERENCES /*LOAD_WITH_ALTERED_SEARCH_PATH*/);
		
		if (gHand == NULL)
			throw runtime_error("Can't load dll, check the path " + string(buffer_module));

                   typedef long (CALLBACK* PFunc)(MOD *, MODFI *);

		const char *func = "Func2";

		PFunc pf = (PExportedSetKey)GetProcAddress(gHand, func);
		
		if (!pf)
		{
			FreeLibrary(gHand);
			throw runtime_error("Can't get address to the function from DLL");
		}
		else
		  pf(In, In2);


W sumie kod nie jest taki wazny, to co zamiescilem mialo tylko zakreslic problem z jakim mam do czynienia.

Chodzi mi tylko o odpowiedz wraz z krotkim komentarzem czy mozliwe jest wyluskanie bledu i wyrzucenie na ekran generowanego przez wewnetrznie odpalaną przez dany program dll-ke (tzw. slave dll)?

0

PS.

Dla testow do pliku wpisalem zla dlugosc jednej z lini i taki tez blad powinien wyskoczyc z dll-ki. Jednak podczas debugowania po wywolaniu tej dll-ki

pf(In, In2);

pojawia sie: "Unhandled exception (INP2.dll): 0xC0000005: Access Violation"

Czyli chyba nie przechwytuje jakiegos wyjatku z dll? Wydaje mi sie ze to powinno byc przez:

catch (...)
	{
		gsError = "Unknown error...";
		return LFALSE;
	}
0

Moze na razie zostawie powyzsze zagadnienie...

A moze wiecie jak wyluskac wartosc jakiejs zmiennej uzytej w tej DLL-ce? Wiem jak odwolac sie do jakiejs funkcji z DLL-ki, ale czy jest mozliwosc zagladniecia do zmiennej globalnej ktora ta funkcja uzywa?

Do funkcji dobieram sie w ten sposob:

                       //.......
                  HINSTANCE gHand;

                  strcat(buffer_module, "INP2.dll"); //buffer module to sciezka do dll
                        
             gHand = LoadLibraryEx((LPCTSTR)buffer_module, NULL, DONT_RESOLVE_DLL_REFERENCES /*LOAD_WITH_ALTERED_SEARCH_PATH*/);
                
                if (gHand == NULL)
                        throw runtime_error("Can't load dll, check the path " + string(buffer_module));

                   typedef long (CALLBACK* PFunc)(MOD *, MODFI *);

                const char *func = "Func2";

                PFunc pf = (PExportedSetKey)GetProcAddress(gHand, func);
                
                if (!pf)
                {
                        FreeLibrary(gHand);
                        throw runtime_error("Can't get address to the function from DLL");
                }
                else
                  pf(In, In2);

....a po wartosc zmiennej np. licznika lini w pliku (int) ktorą używa 'Func2', daloby sie siegnac?

0

Kompilujesz dll do wersji debug i używasz debuggera (ustawiasz breakpointa we wewnątrz funkcji fun2 i potem wykonujesz program krok po koku).

0

Problem tkwi w tym ze nie mam dostepu do kodu dllki, tzn nie moge jej przekompilowac, mam jedynie informacje jakie sa w niej funkcjie, zmienne... Nie moge nic zmienic w dllce.

1 użytkowników online, w tym zalogowanych: 0, gości: 1