精华内容
下载资源
问答
  • iz3d 3D立体游戏的软件

    2010-07-14 17:25:42
    举个简单例子,游戏角色往更远地方跑时你甚至会不由得伸长脖子,生怕走远了会找不到人来,这现实生活中是很平常一个动作,但这个动作以往游戏中是无论如何都不会做出来! 另外不得不说是,打开3D模式...
  • 图一我们手机安装的软件,假设是你第一次打开的情况,那么这个过程中我完全可以偷偷下载一个patch.dex的dex包放固定的一个目录下,图三是放在/sdcard/patch.dex这个路径中,那么当你第二个打开应用的时候就...

    你知道你安装的APP在你不知情的情况下偷偷更新吗,下面带大家看下案例

    图一为我们手机上安装的软件,假设是你第一次打开的情况,那么在这个过程中我完全可以偷偷下载一个patch.dex的dex包放到固定的一个目录下,图三是放在/sdcard/patch.dex这个路径中,那么当你第二个打开应用的时候就会发现,你的应用页面变成图二所示的页面,这是什么原理呢,下面我们在分析下。

    先看下MyApplication代码,自己创建一个MyApplication继承Application,然后初始化,别忘了在AndroidManifest.xml中添加name属性

    public class MyApplication extends Application {
        @Override
        protected void attachBaseContext(Context base) {
            super.attachBaseContext(base);
            EnjoyFix.installPatch(this, new File("/sdcard/patch.dex"));
        }
    }

    attachBaseContext方法中就做了一个操作,加载sdcard目录下的patch.dex,至于这个patch.dex包是如何生成的,我们后面会说到,在看下主界面代码:

    public class MainActivity extends AppCompatActivity {
        TextView tv1;
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tv1 = (TextView)findViewById(R.id.tv1);
            havaBug();
    //        repairBug();
        }
    
        private void havaBug(){
            tv1.setText("Bug Bub Bug");
            Toast.makeText(this,"Bug Bub Bug",Toast.LENGTH_LONG).show();
        }
    
        private  void repairBug(){
            tv1.setText("修复修复");
            Toast.makeText(this,"修复修复",Toast.LENGTH_LONG).show();
        }
    
    }

    页面创建时调用了havaBug()方法,将页面文字设置为了Bug Bug Bug,然后我们将havaBug()方法注释,将repairBug()方法放开,这个方法将页面提示改为 修复修复,然后将修改后的类打成一个patch.dex的dex包,那么在应用启动的时候就会加载这个dex包,你的应用就偷偷完成更新功能了。

    patch.dex这个dex包是如何产生的呢,我们知道写的原生的代码是.java的形式,我们在编译的过程会将.java文件编译成.class文件,android把所有.class文件合并优化,然后生成一个classes.dex,classes.dex可以直接在 android 运行环境执行,一般可以通过 PathClassLoader 去加载 dex 文件,具体如何加载后面会介绍到,我们的patch.dex文件的生成可以借助sdk目录中的dx.bat来生成,修改代码编译后我已经拿到了MainActivity.class,借助dx.bat将其转为patch.dex,具体使用方法如下图:

    进入到build-tools目录下,选择任意一个版本即可,里面均有dx.bat,我jdk使用的1.8版本的,所以在将class转成dex中加了参数

    --no-strict,得到dex文件后放到我们初始化时要加载的dex文件路径即可。

    我们可以对生成的dex文件反编译一下,看看里面是不是修复后的代码,反编译后代码如下:

    毫无疑问,onCreate中执行了repairBug()方法。

    看到这相信有个疑问一直在大家心中,installPatch(this, new File("/sdcard/patch.dex"))方法里面做了什么操作就能自动加载dex文件,更新项目呢,下面我们具体看一看:

    public static void installPatch(Application application, File patch) {
        File hackFile = initHack(application);
        ClassLoader classLoader = application.getClassLoader();
        List<File> files = new ArrayList<>();
        if (patch.exists()) {
            files.add(patch);
        }
        files.add(hackFile);
        File dexOptDir = application.getCacheDir();
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                V23.install(classLoader, files, dexOptDir);//23+ 6.0及以上
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
               ... //19+ 4.4以上
            } else {  // 18- 4.3以下
               ...
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    首先初始化原本的文件,判断patch.dex是否存在,若存在就加载到数组最前面,然后在加载原本存在的其他dex文件,后面根据api版本不同执行不同方法,例如在api23+版本中执行install方法,并传递了三个参数,这里注意这三个参数的区别,实际上不同版本主要就是这里的传参不同,后面会具体介绍,先看api23+版本的方法:

    private static final class V23 {
        private static void install(ClassLoader loader, List<File> additionalClassPathEntries,
                                    File optimizedDirectory)
                throws IllegalArgumentException, IllegalAccessException,
                NoSuchFieldException, InvocationTargetException, NoSuchMethodException,
                IOException {
            Field pathListField = ShareReflectUtil.findField(loader, "pathList");
            Object dexPathList = pathListField.get(loader);
            ArrayList<IOException> suppressedExceptions = new ArrayList<>();
            Object[] objects = makePathElements(dexPathList,
                    new ArrayList<>(additionalClassPathEntries), optimizedDirectory,
                    suppressedExceptions);
            ShareReflectUtil.expandFieldArray(dexPathList, "dexElements", objects);
            if (suppressedExceptions.size() > 0) {
                for (IOException e : suppressedExceptions) {
                    Log.w(TAG, "Exception in makePathElement", e);
                    throw e;
                }
            }
        }
    
        /**
         * 把dex转化为Element数组
         */
        private static Object[] makePathElements(
                Object dexPathList, ArrayList<File> files, File optimizedDirectory,
                ArrayList<IOException> suppressedExceptions)
                throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
            //通过阅读android6、7、8、9源码,都存在makePathElements方法
            Method makePathElements = ShareReflectUtil.findMethod(dexPathList, "makePathElements",
                    List.class, File.class,
                    List.class);
            return (Object[]) makePathElements.invoke(dexPathList, files, optimizedDirectory,
                    suppressedExceptions);
        }
    }
    

    看到这段代码是不是一头晕,哈哈,我们一点一点来分析下,介绍到这里了就不得不说我们本篇的重点之一:android类加载,先上一张图:

    PathClassLoader.java代码如下:

    public class PathClassLoader extends BaseDexClassLoader {

        public PathClassLoader(String dexPath, ClassLoader parent) {
            super(dexPath, null, null, parent);
        }

        public PathClassLoader(String dexPath, String libraryPath,
                ClassLoader parent) {
            super(dexPath, null, libraryPath, parent);
        }
    }

    DexClassLoader.java代码如下:

    public class DexClassLoader extends BaseDexClassLoader {
        public DexClassLoader(String dexPath, String optimizedDirectory,
                String libraryPath, ClassLoader parent) {
            super(dexPath, new File(optimizedDirectory), libraryPath, parent);
        }
    }

    BaseDexClassLoader.java代码如下:

    public class BaseDexClassLoader extends ClassLoader {
        private final DexPathList pathList;

        public BaseDexClassLoader(String dexPath, File optimizedDirectory,
                String libraryPath, ClassLoader parent) {
            super(parent);
            this.pathList = new DexPathList(this, dexPath, libraryPath, optimizedDirectory);
        }

     ......
    }

    DexPathList.java(api23)代码如下:

    final class DexPathList {
      
        /**
         * List of dex/resource (class path) elements.
         * Should be called pathElements, but the Facebook app uses reflection
         * to modify 'dexElements' (http://b/7726934).
         */
        private final Element[] dexElements;
        ......
        
        public DexPathList(ClassLoader definingContext, String dexPath,
                           String libraryPath, File optimizedDirectory) {
            ......
            ArrayList<IOException> suppressedExceptions = new ArrayList<IOException>();
            // save dexPath for BaseDexClassLoader
    //不同api版本中方法名及参数是不同的,前文中的installPatch方法中根据这里做适配,后面会出一个各个api版本中差别介绍
            this.dexElements = makePathElements(splitDexPath(dexPath), optimizedDirectory,
                    suppressedExceptions);
    
            ......
        }
        
    
        /**
         * Makes an array of dex/resource path elements, one per element of
         * the given array.
         */
        private static Element[] makePathElements(List<File> files, File optimizedDirectory,
                                                  List<IOException> suppressedExceptions) {
            List<Element> elements = new ArrayList<>();
            /*
             * Open all files and load the (direct or contained) dex files
             * up front.
             */
            for (File file : files) {
                File zip = null;
                File dir = new File("");
                DexFile dex = null;
                String path = file.getPath();
                String name = file.getName();
    
                if (path.contains(zipSeparator)) {
                    String split[] = path.split(zipSeparator, 2);
                    zip = new File(split[0]);
                    dir = new File(split[1]);
                } else if (file.isDirectory()) {
                    elements.add(new Element(file, true, null, null));
                } else if (file.isFile()) {
                    if (name.endsWith(DEX_SUFFIX)) {
                        // Raw dex file (not inside a zip/jar).
                        try {
                            dex = loadDexFile(file, optimizedDirectory);
                        } catch (IOException ex) {
                            System.logE("Unable to load dex file: " + file, ex);
                        }
                    } else {
                        zip = file;
    
                        try {
                            dex = loadDexFile(file, optimizedDirectory);
                        } catch (IOException suppressed) {
                            suppressedExceptions.add(suppressed);
                        }
                    }
                } else {
                    System.logW("ClassLoader referenced unknown path: " + file);
                }
    
                if ((zip != null) || (dex != null)) {
                    elements.add(new Element(dir, false, zip, dex));
                }
            }
    
            return elements.toArray(new Element[elements.size()]);
        }
    
        /**
         * Constructs a {@code DexFile} instance, as appropriate depending
         * on whether {@code optimizedDirectory} is {@code null}.
         */
        private static DexFile loadDexFile(File file, File optimizedDirectory)
                throws IOException {
            if (optimizedDirectory == null) {
                return new DexFile(file);
            } else {
                String optimizedPath = optimizedPathFor(file, optimizedDirectory);
                return DexFile.loadDex(file.getPath(), optimizedPath, 0);
            }
        }
    
        ......
       
    }

    android内部使用的是BaseDexClassLoader、PathClassLoader、DexClassLoader三个类加载器实现从dex文件中读取类数据,其中PathClassLoader和DexClassLoader都是继承自BaseDexClassLoader,PathClassLoader只能加载已经安装到Android系统中的apk文件(/data/app),DexClassLoader可以加载任意目录下的dex/jar/apk/zip文件。在BaseDexClassLoader中new了一个DexPathList,DexPathList中将dex文件转换成dexFile对象,存入Element[]数组,findclass顺序遍历Element数组获取DexFile,然后执行DexFile的findclass。ClassLoader的findClass是通过遍历dexElements[]中的dex来寻找类的,越靠前的Dex优先被系统使用。我们最初开始是怎么做的呢,先生成一个.dex文件,在installPatch方法中将这个dex文件添加数组中,然后在将其他的dex文件添加,就是为了让系统首先加载我们修复后的dex文件。

     

    上面说到,在不同的api中,makePathElements这个方法方法名及参数是不同的,查阅了多个api版本后整理了下面一份表格:

     

    看到这个表我相信大部分人会有疑问的,不是说6+版本之后在反射方法时候都是用的makePathElements,怎么上面的是makeDexElements方法呢,以api24版本为例,this.dexElements = makeDexElements(splitDexPath(dexPath), optimizedDirectory, suppressedExceptions, definingContext);确实没错,那我们看下makeDexElements做了什么

     /**
         * Makes an array of dex/resource path elements, one per element of
         * the given array.
         */
        private static Element[] makeDexElements(List<File> files, File optimizedDirectory,
                                                 List<IOException> suppressedExceptions,
                                                 ClassLoader loader) {
            return makeElements(files, optimizedDirectory, suppressedExceptions, false, loader);
        }

    makeDexElements最终返回了makeElements方法,那我们在看看makePathElements方法:
        private static Element[] makePathElements(List<File> files,
                                                  List<IOException> suppressedExceptions,
                                                  ClassLoader loader) {
            return makeElements(files, null, suppressedExceptions, true, loader);
        }
        private static Element[] makePathElements(List<File> files, File optimizedDirectory,
                                                  List<IOException> suppressedExceptions) {
            return makeElements(files, optimizedDirectory, suppressedExceptions, false, null);
        }

    我们通过

    Method makePathElements = ShareReflectUtil.findMethod(dexPathList, "makePathElements",
            List.class, File.class,
            List.class)

    获取makePathElements方法,传递的三个参数分别为List、File、List是不是与makePathElements方法第二个参数完全一致,并且最后均调用了makeElements,所以6+版本之后通过makePathElements来反射方法完全没有问题。

    总结下过程:我们先获取当前应用的PathClassLoader,ClassLoader classLoader = application.getClassLoader(),然后通过反射获取DexPachList的属性pathList,Field pathListField = ShareReflectUtil.findField(loader, "pathList"),在将我们的修复包patch.dex转为Element[],Object[] objects = makePathElements(dexPathList,new ArrayList<>(additionalClassPathEntries), optimizedDirectory, suppressedExceptions),最后将makePathElements生成的objects与原本的dexElements合并。

    如何将dex文件转为Element呢,篇幅刚开始给出了PathClassLoader的源码,他做了啥操作呢,仅仅是继承了父类,然后传了一个dexPath,在其父类BaseDexClassLoader中,通过this.pathList = new DexPathList(this, dexPath, libraryPath, optimizedDirectory)将dexPath传递到DexPathList中,在DexPathList中做了啥呢,将参数传递给了makePathElements这个方法,this.dexElements = makePathElements(splitDexPath(dexPath), optimizedDirectory,suppressedExceptions),那我们是不是也将patch.dex传递给makePathElements方法就能转为Element呢

    我们看下makePathElements 这个方法在DexPathList中的定义 private static Element[] makePathElements,是一个私有的方法,那么我们可以通过反射getDeclaredMethod来获取,注意不同版本的方法名及参数适配(本例api23)

     Method makePathElements = ShareReflectUtil.findMethod(dexPathList, "makePathElements",
                        List.class, File.class,
                        List.class);

    findMethod方法中主要操作:Method method = clazz.getDeclaredMethod(name, parameterTypes);

    Class<?> clazz = instance.getClass(); clazz != null; clazz = clazz.getSuperclass()

    为了更直观的的说明classLoader、pathList、dexElements的关系,上一张图如下:

    至此,这个demo算是完成了。

     

     

    展开全文
  • 《豆瓣资源下载大师》是一款好用搜索聚合工具,让用户以作品豆瓣评论详情页入口,直达各种资源网站作品下载页,极大减轻了资源工作量! 086《CSDN开发助手》CSDN官方合法免广告工具,内含大量实用开发...
  • 推荐为什么要说出来?经典书如果提,你们又要说我菜。(害) 这几本书都要看吗?当然不是,如果你是准备面试,我个人建议是读其中一本就够了。至于说看哪一本,你可以对应电子书,挑一个章节试读一下,...
  • 对于希望从 macOS Catalina 更新到 macOS Big Sur 而在软件更新中搜索不到推送用户,请前往 AppStore 搜索 "macOS Big Sur" 并点击获取即可。 更新配置文件 / 从 Clover 迁移至 OpenCore 请直接 macOS 环境下...
  • 小菜鸟我,每逢看源码时就找不到个准头,看着看着就迷糊了。恰巧今天逛知识星球时,看一个球友回答觉得非常好,特此转录一下 如何写好注释 请停止代码注释 如何写Java文档注释(Java Doc Comments) ...
  • 1.安装bundle install --path vendor/bundle时,总是提示rake-0.9.2源中找不到(bundle安装过程中总是有一步,feching source index from rubygems.org)。所以,我单独下载安装了rake0.9.2。并且修改了 /usr/...
  • 读写分离主要是为了将数据库读和写操作分不到不同数据库节点。主服务器负责写,从服务器负责读。另外,一主一从或者一主多从都可以。 读写分离可以大幅提高读性能,小幅提高写性能。因此,读写分离更适合...
  • 读写分离主要是为了将数据库读和写操作分不到不同数据库节点。主服务器负责写,从服务器负责读。另外,一主一从或者一主多从都可以。 读写分离可以大幅提高读性能,小幅提高写性能。因此,读写分离更适合...
  • 读写分离主要是为了将数据库读和写操作分不到不同数据库节点。主服务器负责写,从服务器负责读。另外,一主一从或者一主多从都可以。 读写分离可以大幅提高读性能,小幅提高写性能。因此,读写分离更适合...
  • 为什么我新建布局文件后直然后findComponentById一直报红色找不到的问题? 目前这个2.0.8.203有些bug,官方已收到反馈,后续会修复。 目前新建布局文件时候,ResourceTable一定找不到布局文件和id,此时...
  • 这个issue里写明了为什么 oc图形化os选择页面无用理由也同上 因为你不用oc去引导windows并且直接省略选择页面,所以图形化oc界面也就没用 一定要先改三码再用,具体教程自己百度 icloud中查找我...
  • 如果不是远程依赖,而是下载的例子程序,那么还需要将例子程序中的config.gradle放入你的主项目根目录中,然后根目录build.gradle的第一行加入: apply from: "config.gradle" 注意: config.gradle中的 android =...
  • 1. 为什么有这个表 作为开发者其实比较好奇其他人做什么业余项目(不管目的是做到盈利/玩票/试试看) 所以特意建了这个库。欢迎各位开发者把自己项目加进来~ 发 Pull Request 或 Issue 即可 (入选标准:必须是...
  • 开发工具idea或eclipse还需要安装lombok插件,否则会提示找不到实体类的的get/set方法 运行KvfAdminApplication.java,启动项目【kvf-admin】 idea启动访问:http://localhost/【一般idea都会自动去掉项目名】【这里...
  • 入门熟悉NLP过程中,用到了很多github上的包,遂整理了一下,分享这里。 很多包非常有趣,值得收藏,满足大家收集癖! 如果觉得有用,请分享并star,谢谢! 长期定时更新,欢迎watch和fork! 涉及内容...
  • 当客户机第一次调用一个Stateful Session Bean 时,容器必须立即服务器中创建一个新Bean实例,并关联客户机,以后此客户机调用Stateful Session Bean 方法时容器会把调用分派与此客户机相关联Bean实例...
  • 国内用户如果访问GitHub比较慢话,也可以关注我知乎号Python-Jack上的“从零开始学Python”专栏,专栏会持续更新,还有大家比较期待“数据分析”内容也即将上线,欢迎大家关注我知乎专栏、文章和回答。...
  • Eclipse开发PHP环境配置

    2011-05-17 15:26:00
    这里下载注意:DLTK是所谓动态语言开发包,PDT依赖于它,不知为什么现在官方主页上的稳定版本从1.0版降了0.95,而PDT必须在1.0运行,所以请选择最新Integration版本(在页面最下面),而不是Release或Stable...

    首先准备好软件:

    1. Apache,到这里找个最新版本

    2. PHP,到这里下载

    注意:DLTK是所谓动态语言开发包,PDT依赖于它,不知为什么现在官方主页上的稳定版本从1.0版降到了0.95,而PDT必须在1.0上运行,所以请选择最新的Integration版本(在页面最下面),而不是Release或Stable版本。

    3. EclipsePHP,到这里下载

    4. Zend Debugger,到这里下载

     

    下面开始安装配置这些软件。

    首先,安装配置Apache和php环境。

    安装不多说,Apache是个msi文件,php只要解压缩就可以了。

    配置比较烦,步骤如下:

    1. 编辑php.ini

     1) extension_dir = "./"    修改为 extension_dir = "C:/php-5.2.6/ext"
     2) ;extension=php_mysql.dll”和“;extension=php_gd2.dll”,去掉前面的分号,即把 ;extension=php_mysql.dll 改为 extension=php_mysql.dll 
    把 ;extension=php_gd2.dll 改为 extension=php_gd2.dll 
     3).保存好php.ini,然后重起apache

    2. 修改Apache/conf下的httpd.conf,在文件尾部添加:

    LoadModule php5_module "C:/php-5.2.6/php5apache2_2.dll"
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
    Action application/x-httpd-php "/php/php-cgi.exe"
    AddType application/x-httpd-php .html
    AddType application/x-httpd-php .htm
    AddDefaultCharset UTF8

    PHPIniDir "C:/php-5.2.6"

     

    3.在环境变量的Path设置下添加:

    C:/php-5.2.6;C:/php-5.2.6/ext

     

    经过上述配置,在Apache/htdocs目录下创建一个php测试文件index.php如下:

     


    <?php
     
    phpinfo();
    ?>

    记得重新启动Apache。

    打开IE在地址栏输入:http://localhost/index.php,如果能工作就表示php和apache能工作了。

     

    然后,配置Eclipse的PHP开发,调试环境。

    1. 安装Eclipse.就是解压缩到一个目录

    2. 安装DLTK.

    把下载到的文件解压缩到某目录下,如:F:"PHP"PDT"dltk-core-I-I200809081043-200809081043-incubation,启动Eclipse->Help->Software Updates->Available Software -> Add Site -> Local -> 选择刚才的解压缩目录,安装之。

    3. 安装PDT2.0

    根DLTK安装类似。

    4. 安装ZDebugger

    把下载到的ZendDebugger-5.2.14RC9-cygwin_nt-i386.zip解压缩,目录下有一个readme.txt,按照上面说的安装就行了,根据我安装的实际情况执行readme.txt的结果如下:

    1)  从5_2_x_comp目录下选择ZendDebugger.dll,copy到C:/php-5.2.6/ext下面

    2)  在php.ini文件中添加:

    zend_extension_ts=C:/php-5.2.6/ext/ZendDebugger.dll
    zend_debugger.allow_hosts=localhost,127.0.0.1

    zend_debugger.expose_remotely=always

    3) 将dummy.php文件copy到C:/Program Files/Apache Software Foundation/Apache2.2/htdocs下面

    5. 配置Eclipse及Apache

    1) 配置Apache:

    比如我在 E:/EclipseWorkspace下放置所有的Eclipse工程,那么修改Apache/conf/httpd.conf,在文件结尾添加:

    Alias /Workspace/ "E:/EclipseWorkspace/"
    <Directory "E:/EclipseWorkspace/">
       Options Indexes MultiViews
       AllowOverride None
       Order allow,deny
       Allow from all

    </Directory>

    这样做的好处是,所有php工程都共享一个apache配置(看下面如何设置)。

    2)配置Eclipse:

    打开Eclipse->Window->Preferences->PHP:

    PHP Executables->Add,如下所示设置:

     

     PHP Servers->New,如下所示设置:

     

     注意URL栏中添加了Workspace,这个是在httpd.conf中添加的目录别名。

    PHP Debug,如下图所示,选择合适的Debugger,Server 

     

     至此,配置完成。

     记得再次重新启动Apache。

    最后,建一个测试程序,看看效果如何:

    新建一个PHP Project命名叫FirstPHPTest, 当然使用的是我们的E:/EclipseWorkspace作为Eclipse的workspace目录。

    在工程中新建PHP File, 比如使用上面的index.php。

    当在index.php上右键 Run As->PHP Web Page时就可以看到类似如下画面了:

     

     

    展开全文
  • cFosSpeed 官方网站上找不到防火墙字眼, 可能没有吧~~~~ Q: cFos 所提供 PPPoE 是什么? 可以给 ADSL or Cable 使用吗? A: 如果你用 ADSL, Cable 是原本需要安装 PPPoE 或是电信告诉你用 Windows 2K/XP/2003...
  • 然后网上了会,发现一个HighCharts类库,一个JQuery插件,使用这个绘制出来图形挺好看,效果也令人满意,但是目前跟AJAX结合之后,highcharts制造出来内存一直没有删除,PF使用率以每秒3MB速度网上猛涨...
  • 113.BIOS中有时会找不到硬盘 114.硬盘DMA关闭导致系统运行过慢 115.辨别硬盘软、硬故障 116.Fdisk无法读取硬盘分区 117.主分区没有激活而不能引导系统 118.坏区造成Fdisk不能通过检测 119.坏道导致硬盘间断...
  • Win95/98/NT操作平台其它调用Agent客户程序提供服务。客户程序可以是利用VB、 C++、Delphi、VFP、PB等开发应用软件,也可以是HTML文件中Visual Script、Java Script 脚本语言代码。 安装Agent核心...
  • SkinEngine 3.4.7 汉化版

    热门讨论 2008-05-16 16:58:07
    <br>拖一个button到页面上,编译,通不过,提示找不到相关DCU文件,没办法,重新回到SkinEngine安装目录中,把sources目录中所有文件拷贝到delphi6/lib目录下面,再次编译通过了.具体为什么会这样我也不是很清楚....
  • google code 下载地址 https://code.google.com/p/artdialog/downloads/list 贤心弹出层 http://layer.layui.com 响应式用户交互组件库 https://github.com/bh-lay/UI sweetalert-有css3动画弹出层 ...
  • 电脑蓝屏对照码

    2019-05-05 14:16:40
    ◇解决方案:如果是安装Windows时出现, 有可能是由于你电脑达不到安装Windows最小内存和磁盘要求. 4、0x0000001E:KMODE_EXCEPTION_NOT_HANDLED ◆错误分析:Windows内核检查到一个非法或者未知进程指令, 这个...
  • 8.1.1 为什么要系统调整 253 8.1.2 方法论——从命中率等待事件 253 8.1.3 工具:从STATSPACKAWR 255 8.2 Oracle 10g自动管理框架 257 8.2.1 AWR概述 258 8.2.2 ADDM概述 258 8.3 负载数据自动...
  • SynergyInstaller-1.3.1

    2015-09-15 14:40:26
    工作中,有一台笔记本和一台个人PC,个人PC键盘鼠标都相当难用,遂希望能找到一个能让我使用笔记本键盘和鼠标能直接实时操作另一台PC办法,负所望,发现了synergy这款软件。这款软件的好处在于:它可以跨...
  • x-scan-v3.3-cn

    2013-09-23 21:36:56
    1、为什么找不到扫描器报告漏洞? 扫描器报告服务器存在某个存在漏洞文件,是发送一个GET请求并接收服务器返回值来判断文件是否存在,这个返回值HTTP协议中有详细说明,一般情况下“200”是文件存在,...
  • DGSetup_3040E2_20190628.exe

    2019-07-28 18:48:23
    找不到驱动程序?驱动版本太旧,玩新游戏总是出状况?这都不是事儿,驱动精灵帮你搞定 系统补丁 快速安装 操作系统补丁没打齐?缺少各种.Net、VC运行库致使程序无法运行?驱动精灵可让您系统安全稳定,功能完备。 软件...

空空如也

空空如也

1 2 3
收藏数 46
精华内容 18
关键字:

为什么下载的软件在页面上找不到