示例#1
0
文件: DllManager.cs 项目: sinshu/dtf
        /// <summary>
        /// dllファイルを事前に読み込むことで、dllからdllの間接的な読み込みを防ぐ。
        /// (SDLのsmpeg.dllなどはこれをしないと配置フォルダを変更できないので)
        /// </summary>
        private static YanesdkResult LoadLibrarySafe(string path, string filename)
        {
            YanesdkResult result;

            if (!System.Platform.IsWindows)
            {
                // linuxの場合どうやっていいのかは知らん(`ω´)
                // 必要があるならなんとかしてくれ(´ω`)

                result = YanesdkResult.HappenSomeError;
            }
            else
            {
                string dllPathName = FileSys.ConcatPath(path, filename);

                // いったんCurrent Directoryを変更しないと
                // smpeg.dllのようにDllMainでおかしなことをしているdllは読み込めない。

                // dllは実行ファイル相対で配置されると仮定できる。

                // CurrentDirectoryを一時的に変更する
                {
                    using (CurrentDirectoryHelper helper = new CurrentDirectoryHelper(DllManager.DirectoryPolicy))
                    {
                        // そのdllファイルが存在するのか事前に調べておく。
                        if (FileSys.IsExist(dllPathName))
                        {
                            IntPtr handle = LoadLibrary_(dllPathName);
                            if (handle == IntPtr.Zero)
                            {
                                // Console.WriteLine("dllの読み込みに失敗 : " + dllFileName );
                                //	Debug.Fail(file + " の読み込みに失敗: " +
                                //		(new global::System.ComponentModel.Win32Exception()).Message);
                                result = YanesdkResult.HappenSomeError;                                 // なんか致命的なエラー(´ω`)
                            }
                            else
                            {
                                result = YanesdkResult.NoError;
                            }
                        }
                        else
                        {
                            result = YanesdkResult.FileNotFound;
                        }
                    }
                }
            }
            return(result);
        }