Example #1
0
        /// <summary>
        ///     Check a function is available for this version.
        /// </summary>
        /// <param name="functionInfo"></param>
        /// <returns></returns>
        public bool IsFunctionAvailable(LibVlcFunctionAttribute functionInfo)
        {
            var result = true;

            if (functionInfo.MinVersion != null)
            {
                result = functionInfo.MinVersion < Version;
            }

            if (functionInfo.MaxVersion != null)
            {
                result = result && Version < functionInfo.MaxVersion;
            }

            if (functionInfo.Dev != null)
            {
                result = result && DevString == functionInfo.Dev;
            }

            return(result);
        }
Example #2
0
        /// <summary>
        /// 使用提供的指定版本的 LibVlc 库句柄初始化一个 LibVlcFunction
        /// </summary>
        /// <param name="libHandle">提供的 LibVlc 库句柄</param>
        /// <param name="libVersion">库版本</param>
        public LibVlcFunction(IntPtr libHandle, Version libVersion, String Dev)
        {
            IsEnable = false;
            object[] attrs = typeof(T).GetCustomAttributes(typeof(LibVlcFunctionAttribute), false);

            LibVlcFunctionAttribute functionInfo = null;

            foreach (var item in attrs)
            {
                if (item is LibVlcFunctionAttribute)
                {
                    functionInfo = item as LibVlcFunctionAttribute;
                    break;
                }
            }

            if (functionInfo == null)
            {
                throw new Exception("对于 LibVlcFunction,需要添加 LibVlcFunctionAttribute 才能正常读取函数");
            }

            FunctionName = functionInfo.FunctionName;
            if ((libVersion == null || ((functionInfo.MinVersion == null || functionInfo.MinVersion <= libVersion) && (functionInfo.MaxVersion == null || functionInfo.MaxVersion >= libVersion))) && (functionInfo.Dev == null || functionInfo.Dev == Dev))
            {
                IsEnable = true;

                IntPtr procAddress;
                try
                {
                    procAddress = Win32API.GetProcAddress(libHandle, FunctionName);
                }
                catch (Win32Exception e)
                {
                    throw new Exception(String.Format("在提供的 LibVlc 中找不到函数 {0}", FunctionName), e);
                }

                var del = Marshal.GetDelegateForFunctionPointer(procAddress, typeof(T));
                functionDelegate = (T)Convert.ChangeType(del, typeof(T));
            }
        }