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();
}
}