summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBe <be.0@gmx.com>2022-04-13 12:25:47 -0500
committerGitHub <noreply@github.com>2022-04-13 18:25:47 +0100
commitcceca542551ca8a23cee1f4ebfb3f9a792cb0296 (patch)
treef78e0d6f05a8078115c35fdbf816b8d5ed2d7d35
parent84d80c0a8c4f62839995ff96ad2b00d3ffed6211 (diff)
downloadjack2-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.c16
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);