Skip to content

Commit

Permalink
Merge pull request #5 from nitro44x/FreeLibrary_retcode
Browse files Browse the repository at this point in the history
Fixed error code checking for Win32 systems
  • Loading branch information
drdanz authored Apr 5, 2019
2 parents 8690ae6 + 1e089ba commit 6192cc3
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 35 deletions.
66 changes: 37 additions & 29 deletions src/SharedLibrary.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,55 +55,63 @@ bool SharedLibrary::open(const char *filename)
close();
#if defined(_WIN32)
mPriv->implementation = (void*)LoadLibrary(filename);
LPTSTR msg = nullptr;
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS,
nullptr, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&msg, 0, nullptr);
if (!mPriv->implementation) {
LPTSTR msg = nullptr;
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS,
nullptr, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&msg, 0, nullptr);

if(msg != nullptr) {
mPriv->err_message = std::string(msg);
// release memory allocated by FormatMessage()
LocalFree(msg); msg = nullptr;
if (msg != nullptr) {
mPriv->err_message = std::string(msg);
// release memory allocated by FormatMessage()
LocalFree(msg); msg = nullptr;
}
}
return (mPriv->implementation != nullptr);
#else
mPriv->implementation = dlopen(filename, RTLD_LAZY);
char* msg = dlerror();
if(msg)
mPriv->err_message = msg;
if (!mPriv->implementation) {
char* msg = dlerror();
if (msg)
mPriv->err_message = msg;
}
return mPriv->implementation != nullptr;
#endif
}

bool SharedLibrary::close() {
int result = 0;
bool error = false;
if (mPriv->implementation != nullptr) {
#if defined(WIN32)
result = FreeLibrary((HINSTANCE)mPriv->implementation);
LPTSTR msg = nullptr;
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS,
nullptr, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&msg, 0, nullptr);

if(msg != nullptr) {
mPriv->err_message = std::string(msg);
// release memory allocated by FormatMessage()
LocalFree(msg); msg = nullptr;
auto result = FreeLibrary((HINSTANCE)mPriv->implementation);
if (!result) {
error = true;
LPTSTR msg = nullptr;
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS,
nullptr, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&msg, 0, nullptr);

if (msg != nullptr) {
mPriv->err_message = std::string(msg);
// release memory allocated by FormatMessage()
LocalFree(msg); msg = nullptr;
}
}
#else
result = dlclose(mPriv->implementation);
auto result = dlclose(mPriv->implementation);
if (result != 0) {
char* msg = dlerror();
if(msg)
mPriv->err_message = msg;
error = true;
char* msg = dlerror();
if(msg)
mPriv->err_message = msg;
}
#endif
mPriv->implementation = nullptr;

}
return (result == 0);
return error;
}

std::string SharedLibrary::error()
Expand Down
10 changes: 5 additions & 5 deletions src/shlibpp/SharedLibraryClassApi.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ extern "C" {

using createFn_t = void*(*)();
using destroyFn_t = void(*)(void*);
using getFn_t = int32_t(*)(char*, size_t);
using getFn_t = size_t(*)(char*, size_t);

createFn_t create; // Instantiate a plugin object.
destroyFn_t destroy; // Destroy a plugin object.
Expand Down Expand Up @@ -114,24 +114,24 @@ constexpr int32_t SHLIBPP_DEFAULT_SYSTEM_VERSION = 5;
} \
} \
\
SHLIBPP_SHARED_CLASS_FN int32_t factoryname ## _getVersion (char* ver, size_t len) \
SHLIBPP_SHARED_CLASS_FN size_t factoryname ## _getVersion (char* ver, size_t len) \
{ \
return 0; \
} \
\
SHLIBPP_SHARED_CLASS_FN int32_t factoryname ## _getAbi (char* abi, size_t len) \
SHLIBPP_SHARED_CLASS_FN size_t factoryname ## _getAbi (char* abi, size_t len) \
{ \
return 0; \
} \
\
SHLIBPP_SHARED_CLASS_FN int32_t factoryname ## _getClassName (char* name, size_t len) \
SHLIBPP_SHARED_CLASS_FN size_t factoryname ## _getClassName (char* name, size_t len) \
{ \
char cname[] = # classname; \
strncpy(name, cname, len); \
return strlen(cname) + 1; \
} \
\
SHLIBPP_SHARED_CLASS_FN int32_t factoryname ## _getBaseClassName (char* name, size_t len) \
SHLIBPP_SHARED_CLASS_FN size_t factoryname ## _getBaseClassName (char* name, size_t len) \
{ \
char cname[] = # basename; \
strncpy(name, cname, len); \
Expand Down
2 changes: 1 addition & 1 deletion src/shlibpp/SharedLibraryFactory.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

namespace shlibpp {

class SharedLibraryClassApi;
struct SharedLibraryClassApi;

/**
* A wrapper for a named factory method in a named shared library.
Expand Down

0 comments on commit 6192cc3

Please sign in to comment.