• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Crash podczas ładowania DLL.

Object Storage Arubacloud
0 głosów
223 wizyt
pytanie zadane 6 maja 2017 w C i C++ przez MisterVento3 Użytkownik (830 p.)
edycja 6 maja 2017 przez MisterVento3

Witam,

mam problem z wyeksportowaniem dll'ki. Podczas ładowania dll'ki w innym programie crash'uje się na ładowaniu tej dll'ki. Dając breakpoint'a w miejscu ładowania, program kończy się na "LoadLibrary" i nie idzie dalej.

Problem prawdopodobnie jest w tych plikach, ponieważ po usunięciu dll'ka działa.

#ifndef LOGGER_H
#define LOGGER_H

#include "loglevel.h"
#include "logmessage.h"
#include "active.h"
#include <vector>

		class Logger
		{
		private:
			std::vector<LogSink>					m_Sinks;
			std::unique_ptr<LoggerSystem::Active>   m_Active;

		public:
			Logger(const std::string& filename);

			LogMessage operator()(LogLevel level, const std::string& filename, int line, int color);

			void Add(const LogSink& sink);
			void Remove(const LogSink& sink);

			void Flush(const LogMessage& message) const;
		};

		extern Logger g_Logger;

#define gLogLevel(level, color) ::SteelEngine::LoggerSystem::g_Logger( \
    ::SteelEngine::LoggerSystem::LogLevel::level,               \
    __FILE__,                                                   \
    __LINE__,                                                   \
	color														\
    )

#define gLog(color) gLogLevel(MESSAGE, color)
#define gLogDebug   gLogLevel(DEBUG, 3)
#define gLogMessage gLogLevel(MESSAGE, 15)
#define gLogError   gLogLevel(ERROR_, 4)
#define gLogWarning gLogLevel(WARNING, 14)
#define gLogFatal   gLogLevel(FATAL, 12)

#endif
#include "logger.h"
#include "logsink.h"

		Logger::Logger(const std::string& filename)
		{
			m_Active = SteelEngine::LoggerSystem::Active::Create();

			Add(makeConsoleSink());
			Add(makeFileSink(filename));
		}

		LogMessage Logger::operator()(LogLevel level, const std::string& filename, int line, int color)
		{
			//SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
			return LogMessage(level, filename, line, color, this);
		}

		void Logger::Add(const LogSink& sink)
		{
			m_Sinks.push_back(sink);
		}

		void Logger::Remove(const LogSink& sink)
		{
			auto it = std::find(m_Sinks.begin(), m_Sinks.end(), sink);

			if (it == m_Sinks.end())
				throw std::runtime_error("Tried to remove a sink that was not added yet");

			m_Sinks.erase(it);
		}

		void Logger::Flush(const LogMessage& message) const
		{
			auto&& sinks = m_Sinks;
			auto&& meta = message.m_Meta;
			auto msg = message.m_Buffer.str();

			m_Active->Send([=] {
				for (auto&& sink : sinks)
					sink.Forward(meta, msg);
			});
		}

		Logger g_Logger("overdrive.log");

Jeśli będzie potrzeba, dołączę resztę kodu.

Edit:

#ifndef ACTIVE_H
#define ACTIVE_H

#include <memory>
#include <functional>
#include <thread>
#include <boost\thread\sync_queue.hpp>

		typedef std::function<void()> Callback;

		class Active
		{
		private:
			bool						m_IsDone;
			boost::sync_queue<Callback> m_MessageQueue;
			std::thread					m_Thread;

			Active();

			void Run();

		public:
			Active(const Active&) = delete;
			~Active();

			Active& operator=(const Active&) = delete;

			static std::unique_ptr<Active> Create();
			void Send(Callback message);
		};

#endif // ACTIVE_H
#include "active.h"

		Active::Active() :
			m_IsDone(false)
		{

		}

		Active::~Active()
		{
			Send([this] { m_IsDone = true; });

			m_Thread.join();
		}

		std::unique_ptr<Active> Active::Create()
		{
			std::unique_ptr<Active> result(new Active);

			result->m_Thread = std::thread(&Active::Run, result.get());

			return result;
		}

		void Active::Send(Callback message)
		{
			m_MessageQueue.push(std::move(message));
		}

		void Active::Run()
		{
			while (!m_IsDone)
			{
				Callback fn;

				m_MessageQueue.wait_pull(fn);

				fn();
			}
		}

 

komentarz 6 maja 2017 przez j23 Mędrzec (194,920 p.)
Co to za dll-ka i czego dotyczy ten kod, który podałeś?
komentarz 6 maja 2017 przez MisterVento3 Użytkownik (830 p.)
Staram się napisać wsparcie dla run time c++, lecz przeszkadza mi w tym biblioteka boost, ponieważ z jakiegoś powodu gdy kompiluje kod z tą biblioteką run time się wywala, dlatego usiłuję zrobić dll'kę z nadzieją że to jakoś pomoże. Ten kod służy do wypisywania logów programu, a dll'ka jest tylko testowa, z jakimś prostym, nieistotnym kodem. I problem jest z tym tutaj kodem, a dokładnie z 10 linijką source'a, podam jego kod.
komentarz 6 maja 2017 przez j23 Mędrzec (194,920 p.)

No dobra, ale ten kod jest po stronie dll-ki, czy jak? Pytam, bo tu nie widzę nic, co miałoby związek z biblioteką dynamiczną.

Pokaż implementację Create z 10 linijki.

 

komentarz 6 maja 2017 przez MisterVento3 Użytkownik (830 p.)
Dałem edit'a, ten kod jest po stronie dll'ki. Myślę że problemem jest 45 linijka logger.cpp, powinienem wykonywać nie w dll tylko już w programie, teraz to sprawdzam.
komentarz 6 maja 2017 przez j23 Mędrzec (194,920 p.)
Rozumiem, że bibliotekę łączysz via bibliotekę importów .lib/.a. Błąd może być spowodowany tym, że dll-ka i aplikacja (tudzież inna dll-ka) używają różnych stert. Wtedy aplikacja i biblioteka powinna łączyć dynamicznie runtime'y.
komentarz 6 maja 2017 przez MisterVento3 Użytkownik (830 p.)
Tak jak myślałem, problemem była 45 linijka logger.cpp, nie mogłem tworzyć loggera w dll, musiałem wyeksportować funkcję tworzącą ten logger i wywołać ją w aplikacji.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 140 wizyt
pytanie zadane 8 maja 2018 w C# przez Wittano Początkujący (450 p.)
0 głosów
1 odpowiedź 469 wizyt
pytanie zadane 26 listopada 2016 w C i C++ przez military Obywatel (1,120 p.)
0 głosów
0 odpowiedzi 103 wizyt

92,567 zapytań

141,420 odpowiedzi

319,616 komentarzy

61,953 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...