modelon-community / fmi-library

C library for importing FMUs
Other
115 stars 34 forks source link

UTF8 file path support on Windows #91

Open joerg-schlager opened 1 year ago

joerg-schlager commented 1 year ago

Hi,

in the default Windows configuration for 3.02a, jm_portability_load_dll_handle_with_flag(const char* dll_file_path, jm_portability_loadlibrary_flag_t flag) uses LoadLibraryEx(dll_file_path, NULL, flag); - there is thus no support for UTF8 characters in the dll_file_path, and loading DLLs from any path containing UTF8 characters subsequently fails. Is there any solution for support unicode file paths within fmilib?

joerg-schlager commented 1 year ago

I just drafted a simple fix for this issue (see below), and it appears to be working that way, However, I'm afraid that similar code would need to be injected all over jm_portability.c to get full UTF8 support on Windows.

DLL_HANDLE jm_portability_load_dll_handle_with_flag(const char* dll_file_path, jm_portability_loadlibrary_flag_t flag) {

ifdef WIN32

// first, try to load using UTF16

HMODULE h_module = NULL;
int utf8_len = (int)strlen(dll_file_path);
int utf16_buffer_len =  MultiByteToWideChar(CP_UTF8, 0, dll_file_path, utf8_len, NULL, 0);
if (utf16_buffer_len > 0)
{
    wchar_t* dll_file_path_utf16 = (wchar_t*)malloc(sizeof(wchar_t) * (utf16_buffer_len+1));
    if (dll_file_path_utf16 != NULL)
    {            
        int utf16_len = MultiByteToWideChar(CP_UTF8, 0, dll_file_path, utf8_len, dll_file_path_utf16, utf16_buffer_len);
        if (utf16_len == utf16_buffer_len)
        {
            dll_file_path_utf16[utf16_buffer_len] = L'\0';
            h_module = LoadLibraryExW(dll_file_path_utf16, NULL, flag);
        }
        free(dll_file_path_utf16);            
    }
}                
return (h_module !=NULL) ? h_module : LoadLibraryExA(dll_file_path, NULL, flag);

else

return dlopen(dll_file_path, flag);

endif

}

modelonrobinandersson commented 1 year ago

Hi @joerg-schlager, thank you for highlighting this. Unfortunately we're not able to look into this at the moment but I will keep this open for future enhancements. We are currently prioritizing remaining work for support of FMI 3.0.