diff options
author | Be <be.0@gmx.com> | 2022-04-13 12:25:47 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-13 18:25:47 +0100 |
commit | cceca542551ca8a23cee1f4ebfb3f9a792cb0296 (patch) | |
tree | f78e0d6f05a8078115c35fdbf816b8d5ed2d7d35 | |
parent | 84d80c0a8c4f62839995ff96ad2b00d3ffed6211 (diff) | |
download | jack2-cceca542551ca8a23cee1f4ebfb3f9a792cb0296.tar.gz |
fix JackWeakAPI on Windows (#846)
* JackWeakAPI: fix DLL loading on Windows
LoadLibrary takes a LPCWSTR (UTF16). LoadLibraryA is needed to
work with ASCII C string literals.
* JackWeakAPI: call tryload_libjack if it hasn't been called already
On non-Windows tryload_libjack is loaded on startup with
__attribute__((constructor)) but with MSVC, Microsoft documentation
says to not load libraries in a DLL's initialization function:
https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-best-practices
* JackWeakAPI: add debugging message for Windows
-rw-r--r-- | common/JackWeakAPI.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/common/JackWeakAPI.c b/common/JackWeakAPI.c index 7fcacd72..fbefca23 100644 --- a/common/JackWeakAPI.c +++ b/common/JackWeakAPI.c @@ -62,10 +62,15 @@ void tryload_libjack() } #elif defined(WIN32) #ifdef _WIN64 - libjack_handle = LoadLibrary("libjack64.dll"); + libjack_handle = LoadLibraryA("libjack64.dll"); #else - libjack_handle = LoadLibrary("libjack.dll"); + libjack_handle = LoadLibraryA("libjack.dll"); #endif + if (!libjack_handle) { + char* lpMsgBuf; + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0,NULL ); + fprintf(stderr, "Failed to load libjack DLL: %d", lpMsgBuf); + } #else libjack_handle = dlopen("libjack.so.0", RTLD_LAZY); #endif @@ -77,8 +82,11 @@ void *load_jack_function(const char *fn_name) { void *fn = 0; if (!libjack_handle) { - fprintf (stderr, "libjack not found, so do not try to load %s ffs !\n", fn_name); - return 0; + tryload_libjack(); + if (!libjack_handle) { + fprintf (stderr, "libjack not found, so do not try to load %s ffs !\n", fn_name); + return 0; + } } #ifdef WIN32 fn = (void*)GetProcAddress(libjack_handle, fn_name); |