unity universal media player 中文路径下找不到dll库问题
最近做unity,为了播rtsp流用到了universal media player,然后发现这玩意儿事是真的多,不愧是2年前就没人维护了的东西。
言归正传,众所周知把软件放在中文路径下是很容易导致运行错误的,又众所周知你是很难让你的用户在找你大喊“我的程序为什么打不开了”之前明白这一点的。既然都2021年了,咱还是尝试着用技术手段解决一下吧。
unity本身其实是支持中文路径的,它是用utf-8编码的。但是universal media player不支持。 准确的说,是随缘不支持——我自己的电脑上根本没有中文路径问题,但是另几台上有。甚至某一台上出现了今天一切正常明天展示前夕就报错的玄妙情况。
经过一番捣鼓之后我发现问题可能出在UMP用的loadlibrary函数上。 在这个cs文件里,UMP导入了loadlibrary的代码。而它的格式是这样的:
private static class WindowsInterop
{
[DllImport(LIB_WIN_KERNEL, SetLastError = true, CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool SetDllDirectory([MarshalAs(UnmanagedType.LPStr)]string lpPathName);
[DllImport(LIB_WIN_KERNEL, SetLastError = true, CharSet = CharSet.Ansi)]
internal static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string lpFileName);
[DllImport(LIB_WIN_KERNEL, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
internal static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
[DllImport(LIB_WIN_KERNEL, SetLastError = true)]
internal static extern bool FreeLibrary(IntPtr hModule);
[DllImport(LIB_WIN_ADVAPI, SetLastError = true)]
internal static extern int RegOpenKeyEx(UIntPtr hKey, string subKey, int ulOptions, int samDesired, out UIntPtr hkResult);
[DllImport(LIB_WIN_ADVAPI, SetLastError = true, CharSet = CharSet.Ansi)]
internal static extern uint RegQueryValueEx(UIntPtr hKey, [MarshalAs(UnmanagedType.LPStr)]string lpValueName, int lpReserved, out uint lpType, StringBuilder lpData, ref uint lpcbData);
[DllImport(LIB_WIN_ADVAPI, SetLastError = true)]
internal static extern int RegCloseKey(UIntPtr hKey);
}
问题就在这里:它的路径使用的是[MarshalAs(UnmanagedType.LPStr)],而LPStr这个标签表示单字节ANSI字符串。所以传入路径有中文时就会报错。应修改为表示Unicode的LPTStr以支持中文。 相应的,dllimport中的CharSet也要改成Unicode。
……但是[DllImport(LIB_WIN_KERNEL, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)] internal static extern IntPtr GetProcAddress(IntPtr hModule, string procName); 这一段不用改。一是它其实并不涉及路径,二是……反正我改成unicode就报错。好像会把正常玩意儿给转码成什么奇怪的东西。
|