说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Android开发中实现跨进程通讯的AIDL接口

HTML文档下载 WORD文档下载 PDF文档下载
在Android开发中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢? 显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可

 

在Android开发中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢?  显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦.
AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.
AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.
Android开发中实现跨进程通讯的具体步骤如下:
1、创建AIDL文件, 在这个文件里面定义接口, 该接口定义了可供客户端访问的方法和属性。 如: ITaskBinder.adil
package com.cmcc.demo;
import com.cmcc.demo.ITaskCallback;
interface ITaskBinder {
    boolean isTaskRunning();
    void stopRunningTask();
    void registerCallback(ITaskCallback cb);
    void unregisterCallback(ITaskCallback cb);
}
其中: ITaskCallback在文件ITaskCallback.aidl中定义:
package com.cmcc.demo;
interface ITaskCallback {
    void actionPerformed(int actionId);
}
注意: 理论上, 参数可以传递基本数据类型和String, 还有就是Bundle的派生类, 不过在Eclipse中,目前的ADT不支持Bundle做为参数, 据说用Ant编译可以, 我没做尝试.
2、Android开发中编译AIDL文件, 用Ant的话, 可能需要手动, 使用Eclipse plugin的话,可以根据adil文件自动生产java文件并编译, 不需要人为介入.
3、在Java文件中, 实现AIDL中定义的接口. 编译器会根据AIDL接口, 产生一个JAVA接口。这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用需要的几个方法。接下来就需要自己去实现自定义的几个接口了.
ITaskBinder.aidl中接口的实现, 在MyService.java中接口以内嵌类的方式实现:
private final ITaskBinder.Stub mBinder = new ITaskBinder.Stub() {
        public void stopRunningTask() {
            //@TODO
        }
        public boolean isTaskRunning() {
            //@TODO
            return false;
        }
        public void registerCallback(ITaskCallback cb) {
            if (cb != null) mCallbacks.register(cb);
        }
        public void unregisterCallback(ITaskCallback cb) {
            if (cb != null) mCallbacks.unregister(cb);
        }
};
在MyActivity.java中ITaskCallback.aidl接口实现:
private ITaskCallback mCallback = new ITaskCallback.Stub() {
        public void actionPerformed(int id) {
           //TODO
            printf("callback id=" + id);
        }
};
4、向客户端提供接口ITaskBinder, 如果写的是service,扩展该Service并重载onBind ()方法来返回一个实现上述接口的类的实例。这个地方返回的mBinder,就是上面通过内嵌了定义的那个. (MyService.java)
    public IBinder onBind(Intent t) {
        printf("service on bind");
        return mBinder;
}
在Activity中, 可以通过Binder定义的接口, 来进行远程调用.
5、在服务器端回调客户端的函数. 前提是当客户端获取的IBinder接口的时候,要去注册回调函数, 只有这样, 服务器端才知道该调用那些函数在:MyService.java中:
    void callback(int val) {
        final int N = mCallbacks.beginBroadcast();
        for (int i=0; i<N; i++) {
            try {
                mCallbacks.getBroadcastItem(i).actionPerformed(val);
            } catch (RemoteException e) {
                // The RemoteCallbackList will take care of removing
                // the dead object for us.
            }
        }
        mCallbacks.finishBroadcast();
}
AIDL的创建方法:
AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。由于远程调用的需要, 这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:
1. 不需要import声明的简单Java编程语言类型(int,boolean等)
2. String, CharSequence不需要特殊声明 
3. List, Map和Parcelables类型, 这些类型内所包含的数据成员也只能是简单数据类型, String等其他比支持的类型. 
((另外: 我没尝试Parcelables, 在Eclipse+ADT下编译不过, 或许以后会有所支持).
下面是AIDL语法: 
// 文件名: SomeClass.aidl 
// 文件可以有注释, 跟java的一样 
// 在package以前的注释, 将会被忽略. 
// 函数和变量以前的注释, 都会被加入到生产java代码中.package com.cmcc.demo; 
// import 引入语句import com.cmcc.demo.ITaskCallback;
interface ITaskBinder {
    //函数跟java一样, 可以有0到多个参数 ,可以有一个返回值
    boolean isTaskRunning();
    void stopRunningTask();   
    //参数可以是另外的一个aidl定义的接口
    void registerCallback(ITaskCallback cb);  
    void unregisterCallback(ITaskCallback cb);
    //参数可以是String, 可以用in表入输入类型, out表示输出类型.
    int getCustomerList(in String branch, out String[] customerList);
}
实现接口时有几个原则:
.抛出的异常不要返回给调用者. 跨进程抛异常处理是不可取的..IPC调用是同步的。如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。 也就是IPC调用会挂起应用程序导致界面失去响应. 这种情况应该考虑单起一个线程来处理..不能在AIDL接口中声明静态属性。IPC的调用步骤:
1. 声明一个接口类型的变量,该接口类型在.aidl文件中定义。 
2. 实现ServiceConnection。 
3. 调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递.  
4. 在ServiceConnection.onServiceConnected()实现中,你会接收一个IBinder实例(被调用的Service). 调用    YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换为YourInterface类型。 
5. 调用接口中定义的方法。 你总要检测到DeadObjectException异常,该异常在连接断开时被抛出。它只会被远程方法抛出。 
6. 断开连接,调用接口实例中的ApplicationContext.unbindService()
下面是Android开发中实现AIDL接口的整个程序:
1. ITaskCallback.aidl
package com.cmcc.demo;
interface ITaskCallback {
    void actionPerformed(int actionId);
}
2. ITaskBinder.aidl
package com.cmcc.demo;
import com.cmcc.demo.ITaskCallback;
interface ITaskBinder {
    boolean isTaskRunning();
    void stopRunningTask();   
    void registerCallback(ITaskCallback cb);   
    void unregisterCallback(ITaskCallback cb);
}
3.  MyService.java
package com.cmcc.demo;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.util.Log;
public class MyService extends Service {
    @Override
    public void onCreate() {
        printf("service create");
    }
    @Override
    public void onStart(Intent intent, int startId) {
        printf("service start id=" + startId);
        callback(startId);
    }
    @Override
    public IBinder onBind(Intent t) {
        printf("service on bind");
        return mBinder;
    }
    @Override
    public void onDestroy() {
        printf("service on destroy");
        super.onDestroy();
    }
    @Override
    public boolean onUnbind(Intent intent) {
        printf("service on unbind");
        return super.onUnbind(intent);
    }
    public void onRebind(Intent intent) {
        printf("service on rebind");
        super.onRebind(intent);
    }
    private void printf(String str) {
        Log.e("TAG", "###################------ " + str + "------");
    }
    void callback(int val) {
        final int N = mCallbacks.beginBroadcast();
        for (int i=0; i<N; i++) {
            try {
                mCallbacks.getBroadcastItem(i).actionPerformed(val);
            } catch (RemoteException e) {
                // The RemoteCallbackList will take care of removing
                // the dead object for us.
            }
        }
        mCallbacks.finishBroadcast();
    }
    private final ITaskBinder.Stub mBinder = new ITaskBinder.Stub() {
        public void stopRunningTask() {
        }
        public boolean isTaskRunning() {
            return false;
        }
        public void registerCallback(ITaskCallback cb) {
            if (cb != null) mCallbacks.register(cb);
        }
        public void unregisterCallback(ITaskCallback cb) {
            if (cb != null) mCallbacks.unregister(cb);
        }
    };
   
    final RemoteCallbackList<ITaskCallback> mCallbacks
        = new RemoteCallbackList<ITaskCallback>();
}
4. MyActivity.java
package com.cmcc.demo;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.graphics.Color;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AbsoluteLayout;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.PrintWriter;
public class MyActivity extends Activity {
   
    private Button btnOk;
    private Button btnCancel;
   
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.test_service);
        btnOk = (Button)findViewById(R.id.btn_ok);
        btnCancel = (Button)findViewById(R.id.btn_cancel);
        btnOk.setText("Start Service");
        btnCancel.setTag("Stop Service");
        btnOk.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
                onOkClick();
            }
        });
        btnCancel.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                onCancelClick();
            }
        });
    }
    void onOkClick() {
        Bundle args = new Bundle();       
        Intent intent = new Intent(this, MyService.class);
        intent.putExtras(args);  
        //printf("send intent to start");
        //startService(intent);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
        startService(intent);
    }
    void onCancelClick() {
        Intent intent = new Intent(this, MyService.class);
        //printf("send intent to stop");
        unbindService(mConnection);
        //stopService(intent);
    }
    private void printf(String str) {
        Log.e("TAG", "###################------ " + str + "------");
    }
    ITaskBinder mService;
    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className,
                IBinder service) {
            mService = ITaskBinder.Stub.asInterface(service);
            try {
                mService.registerCallback(mCallback);
            } catch (RemoteException e) {
            }
        }
        public void onServiceDisconnected(ComponentName className) {
            mService = null;
        }
    };
    private ITaskCallback mCallback = new ITaskCallback.Stub() {
        public void actionPerformed(int id) {
            printf("callback id=" + id);
        }
    };
}

作者:sdhjob

 

在Android开发中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢?  显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦.

AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.

AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.

Android开发中实现跨进程通讯的具体步骤如下:

 

1、创建AIDL文件, 在这个文件里面定义接口, 该接口定义了可供客户端访问的方法和属性。 如: ITaskBinder.adil

 

package com.cmcc.demo;

 

import com.cmcc.demo.ITaskCallback;

 

interface ITaskBinder {

    boolean isTaskRunning();

    void stopRunningTask();

    void registerCallback(ITaskCallback cb);

    void unregisterCallback(ITaskCallback cb);

}

 

其中: ITaskCallback在文件ITaskCallback.aidl中定义:

 

package com.cmcc.demo;

interface ITaskCallback {

    void actionPerformed(int actionId);

}

 

注意: 理论上, 参数可以传递基本数据类型和String, 还有就是Bundle的派生类, 不过在Eclipse中,目前的ADT不支持Bundle做为参数, 据说用Ant编译可以, 我没做尝试.

 

2、Android开发中编译AIDL文件, 用Ant的话, 可能需要手动, 使用Eclipse plugin的话,可以根据adil文件自动生产java文件并编译, 不需要人为介入.

 

3、在Java文件中, 实现AIDL中定义的接口. 编译器会根据AIDL接口, 产生一个JAVA接口。这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用需要的几个方法。接下来就需要自己去实现自定义的几个接口了.

 

ITaskBinder.aidl中接口的实现, 在MyService.java中接口以内嵌类的方式实现:

 

private final ITaskBinder.Stub mBinder = new ITaskBinder.Stub() {

        public void stopRunningTask() {

            //@TODO

        }

 

        public boolean isTaskRunning() {

            //@TODO

            return false;

        }

 

        public void registerCallback(ITaskCallback cb) {

            if (cb != null) mCallbacks.register(cb);

        }

 

        public void unregisterCallback(ITaskCallback cb) {

            if (cb != null) mCallbacks.unregister(cb);

        }

};

 

在MyActivity.java中ITaskCallback.aidl接口实现:

 

private ITaskCallback mCallback = new ITaskCallback.Stub() {

        public void actionPerformed(int id) {

           //TODO

            printf("callback id=" + id);

        }

};

 

4、向客户端提供接口ITaskBinder, 如果写的是service,扩展该Service并重载onBind ()方法来返回一个实现上述接口的类的实例。这个地方返回的mBinder,就是上面通过内嵌了定义的那个. (MyService.java)

 

    public IBinder onBind(Intent t) {

        printf("service on bind");

        return mBinder;

}

 

在Activity中, 可以通过Binder定义的接口, 来进行远程调用.

 

5、在服务器端回调客户端的函数. 前提是当客户端获取的IBinder接口的时候,要去注册回调函数, 只有这样, 服务器端才知道该调用那些函数在:MyService.java中:

 

    void callback(int val) {

        final int N = mCallbacks.beginBroadcast();

        for (int i=0; i<N; i++) {

            try {

                mCallbacks.getBroadcastItem(i).actionPerformed(val);

            } catch (RemoteException e) {

                // The RemoteCallbackList will take care of removing

                // the dead object for us.

            }

        }

        mCallbacks.finishBroadcast();

}

 

AIDL的创建方法:

 

AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。由于远程调用的需要, 这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:

 

1. 不需要import声明的简单Java编程语言类型(int,boolean等)

 

2. String, CharSequence不需要特殊声明 

3. List, Map和Parcelables类型, 这些类型内所包含的数据成员也只能是简单数据类型, String等其他比支持的类型. 

((另外: 我没尝试Parcelables, 在Eclipse+ADT下编译不过, 或许以后会有所支持).

下面是AIDL语法: 

// 文件名: SomeClass.aidl 

// 文件可以有注释, 跟java的一样 

// 在package以前的注释, 将会被忽略. 

// 函数和变量以前的注释, 都会被加入到生产java代码中.package com.cmcc.demo; 

// import 引入语句import com.cmcc.demo.ITaskCallback;

 

interface ITaskBinder {

    //函数跟java一样, 可以有0到多个参数 ,可以有一个返回值

 

    boolean isTaskRunning();

    void stopRunningTask();   

 

    //参数可以是另外的一个aidl定义的接口

    void registerCallback(ITaskCallback cb);  

 

    void unregisterCallback(ITaskCallback cb);

 

    //参数可以是String, 可以用in表入输入类型, out表示输出类型.

 

    int getCustomerList(in String branch, out String[] customerList);

 

}

实现接口时有几个原则:

 

.抛出的异常不要返回给调用者. 跨进程抛异常处理是不可取的..IPC调用是同步的。如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。 也就是IPC调用会挂起应用程序导致界面失去响应. 这种情况应该考虑单起一个线程来处理..不能在AIDL接口中声明静态属性。IPC的调用步骤:

 

1. 声明一个接口类型的变量,该接口类型在.aidl文件中定义。 

2. 实现ServiceConnection。 

3. 调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递.  

4. 在ServiceConnection.onServiceConnected()实现中,你会接收一个IBinder实例(被调用的Service). 调用    YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换为YourInterface类型。 

5. 调用接口中定义的方法。 你总要检测到DeadObjectException异常,该异常在连接断开时被抛出。它只会被远程方法抛出。 

6. 断开连接,调用接口实例中的ApplicationContext.unbindService()

 

下面是Android开发中实现AIDL接口的整个程序:

 

1. ITaskCallback.aidl

 

package com.cmcc.demo;

interface ITaskCallback {

    void actionPerformed(int actionId);

}

 

2. ITaskBinder.aidl

package com.cmcc.demo;

import com.cmcc.demo.ITaskCallback;

interface ITaskBinder {

    boolean isTaskRunning();

    void stopRunningTask();   

    void registerCallback(ITaskCallback cb);   

    void unregisterCallback(ITaskCallback cb);

}

 

3.  MyService.java

 

package com.cmcc.demo;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.os.RemoteCallbackList;

import android.os.RemoteException;

import android.util.Log;

public class MyService extends Service {

    @Override

    public void onCreate() {

        printf("service create");

    }

    @Override

    public void onStart(Intent intent, int startId) {

        printf("service start id=" + startId);

        callback(startId);

    }

 

    @Override

    public IBinder onBind(Intent t) {

        printf("service on bind");

        return mBinder;

    }

 

    @Override

    public void onDestroy() {

        printf("service on destroy");

        super.onDestroy();

    }

 

    @Override

 

    public boolean onUnbind(Intent intent) {

        printf("service on unbind");

        return super.onUnbind(intent);

    }

 

    public void onRebind(Intent intent) {

        printf("service on rebind");

        super.onRebind(intent);

    }

 

    private void printf(String str) {

        Log.e("TAG", "###################------ " + str + "------");

    }

 

    void callback(int val) {

        final int N = mCallbacks.beginBroadcast();

        for (int i=0; i<N; i++) {

            try {

                mCallbacks.getBroadcastItem(i).actionPerformed(val);

            } catch (RemoteException e) {

                // The RemoteCallbackList will take care of removing

                // the dead object for us.

            }

        }

        mCallbacks.finishBroadcast();

    }

 

    private final ITaskBinder.Stub mBinder = new ITaskBinder.Stub() {

        public void stopRunningTask() {

        }

 

        public boolean isTaskRunning() {

            return false;

        }

 

        public void registerCallback(ITaskCallback cb) {

            if (cb != null) mCallbacks.register(cb);

        }

 

        public void unregisterCallback(ITaskCallback cb) {

            if (cb != null) mCallbacks.unregister(cb);

        }

    };

 

 

 

    final RemoteCallbackList<ITaskCallback> mCallbacks

        = new RemoteCallbackList<ITaskCallback>();

 

}

 

4. MyActivity.java

 

package com.cmcc.demo;

import android.app.Activity;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

import android.graphics.Color;

import android.os.Bundle;

import android.os.IBinder;

import android.os.RemoteException;

import android.util.Log;

import android.view.View;

import android.view.ViewGroup;

import android.view.View.OnClickListener;

import android.widget.AbsoluteLayout;

import android.widget.Button;

import android.widget.LinearLayout;

import android.widget.RelativeLayout;

import android.widget.TextView;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileOutputStream;

import java.io.FileReader;

import java.io.PrintWriter;

 

public class MyActivity extends Activity {

 

 

    private Button btnOk;

    private Button btnCancel;

 

    @Override

 

    public void onCreate(Bundle icicle) {

        super.onCreate(icicle);

        setContentView(R.layout.test_service);

        btnOk = (Button)findViewById(R.id.btn_ok);

        btnCancel = (Button)findViewById(R.id.btn_cancel);

        btnOk.setText("Start Service");

        btnCancel.setTag("Stop Service");

        btnOk.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {

                onOkClick();

            }

        });

 

        btnCancel.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                onCancelClick();

            }

        });

    }

 

    void onOkClick() {

        Bundle args = new Bundle();       

        Intent intent = new Intent(this, MyService.class);

        intent.putExtras(args);  

        //printf("send intent to start");

        //startService(intent);

        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

        startService(intent);

    }

 

    void onCancelClick() {

        Intent intent = new Intent(this, MyService.class);

        //printf("send intent to stop");

 

        unbindService(mConnection);

        //stopService(intent);

    }

 

    private void printf(String str) {

        Log.e("TAG", "###################------ " + str + "------");

    }

 

    ITaskBinder mService;

 

    private ServiceConnection mConnection = new ServiceConnection() {

        public void onServiceConnected(ComponentName className,

                IBinder service) {

            mService = ITaskBinder.Stub.asInterface(service);

            try {

                mService.registerCallback(mCallback);

            } catch (RemoteException e) {

            }

        }

 

        public void onServiceDisconnected(ComponentName className) {

            mService = null;

        }

    };

 

    private ITaskCallback mCallback = new ITaskCallback.Stub() {

        public void actionPerformed(int id) {

            printf("callback id=" + id);

        }

    };

}

 

来源:http://blog.csdn.net/sdhjob

 

VB如何在 VB 中控制 Modem 行为? VB如何在VB中判断Windows9x的运行模式 VB如何在Visual Basic中实现异步执行程序 VB如何在开机时自动更换墙纸? 使回车具有 Tab 的功能-VB资料 输入时,自动转换成小写? -VB资料 显示多媒体信息 -VB资料 也谈Windows 下的自动存盘 -VB资料 一个小巧精致的CPU监视器 -VB资料 应用VB4.0实现工业控制的实时曲线和历史曲线 应用程序中实现关机功能-VB资料 萤幕抓取与萤幕保护程式 -VB资料 用VB5.0创建Windows快捷方式 用VB5.0收集键盘和鼠标信息 用VBA限制非注册软件使用时间 用VB编程检测当前电池使用情况 用VB编写定时关闭计算机的程序 用VB编写键盘拦截程序 用VB函数轻松访问系统注册表 用VB设计一个定时闹钟程序 用VB实现拖放功能 在VB中启动控制面板 在VB中异步执行程序 在Visual Basic中终止Windows 95 在关机或Logff前信息的拦截-VB资料 VB怎样捕捉窗体的鼠标? VB怎样存取注册表信息 VB怎样改变双击鼠标的时间间隔? VB怎样关闭一个正在运行的程序 VB怎样限制鼠标移动 ANI文件格式 -VB资料 xml spy suite4.2需要联机注册,有没有方法可以使用? linux为何没有出现在启动菜单 @_@ 在DELPHI中如何把一目录下的某文件移到另一目录中——急 在C#中如何用BinaryReader把DLL文件的内容读出来,并转来string? 如何根据Task ID或Process ID得到hwnd 如何让程序启动时自动hide()阿! 问一个最大化窗体与任务栏的关系的问题 把一表中一字段(字符型)以一條記錄返回出來. Rational Rose 中没有Delphi方面得模块,哪儿有与Delphi接口下载 谁有ActiveReport 2的中文例子和原程?在线等待!急急急! 大家来讨论一下,《设计模式》应该怎么看!! 关于打印的问题,高手关注! datagrid如何实现分页,。net菜鸟 声音问题 access数据库加密后,如何再用ADO与之连接? 有谁用过ms Agent? 很菜的问题! delphi里的widestring类型对应着BCB里的什么类型啊 开了一个socket,acept后如何给ie发一个字符串显示出来? access数据库加密后,如何再用ADO与之连接? 如何查询出所有用户表名 PWS中的一个小问题 请问DataSet里的Relations和Constraints有什么区别? 想了三天,还是做不出 请问如何创建一个大于屏幕分辨率的窗口? 公开putao的最大秘密,他女友的隐私! 关于不同版本的用户对象的问题!(online) 在批处理中设置路径,有空格系统不认怎么办? 为了忘却的纪念(今天是咱们的国耻日) 关于JSP菜单实现的问题? 如何判断数组是否被赋值? 用MSCHART的二维折线图如何实现左右坐标分别标识不同的曲线? 请问招行的网上银行的在网上点击安装是怎么实现的呀? 100分只是开始。。。 如果回答继续加!! 一个template问题,想不出办法,高手请进 送分题:如何改变dll的调试可执行文件? 大家看看代码 真搞不懂为什么出错??? 如何在表单中设置包含字段http://schemas.microsoft.com/cdo/workflow/response 如何使用VBSCRIPT读取本页文本框中的数据, (不能用表单提交和JAVASCRIPT 能不能?) 我在桌面上执行一个应用程序,运行正常,但用pb中调用run("***.exe")运行是出错,提示是少了某些dll文件 我怎么才能使客户端发过来的经UF8编码的中文URL,还原成GD312,能找到页面? 我用openwithparm(w_1,arg),arg明明传递的是LONG型的数据,为什么用message.longparm接收到的是0,而一定要用message.doubleparm才能正确 问一个sql语句如何写,简单! 征集能够同时输出文本和图形的控件! 急寻bmp转gif的代码 封装在Dll中的窗口焦点问题 为什么我用JBUILDER编译JSP文件,用web run执行后会出现这些情况?? 有谁用过CMPPE2.0协议开发过网关程序的请进 win2000下内存使用的问题? 我每次都结贴子的,不信你们查一下啊,这次再请帮忙,谢谢哦 在公共文件夹如公告窗体的原件与回复件是如何关联的? xx的感觉真好——作文. 六年级作文《记一节有趣的课》一定要新颖 字数不要太多 也不能太少 急用 三天内请广大朋友尽快回复 赵亮赵亮赵亮赵亮赵亮赵亮赵亮,整死你,还得本小姐回家挨骂了,小亮亮~下次来师大玩死你! 作文:xx感觉真好额……新颖点,新颖点···~叙事的文章叙事文 平面镜与水平面成45度角,在镜前有一发光点在水平向右匀速运动,则他的象运动方向如何,画平面镜与水平面成45度角,在镜前有一发光点在水平向右匀速运动,则他的象运动方向如何,画图说明( 一个花坛的半径是8米,在他的周围有一条宽2米的环形小路,小路的面积是多少平方米 校园一角的作文开头要怎么写?我主要写的是树 一平面镜与水平面成45度角固定在水平桌面上,一小球以1m / s 的速度沿桌面面镜匀速滚去则小球在平面镜中的像 ( )A.以1m / s 做竖直向上的运动 B.以1m / s 做竖直向下的运动 C.以2m / s 做竖直 中国传统文化概论.救命啊练习题3一、填空题1、_______是中国史学的奠基时期._______是我国史学的确立时期._______是我国古代史学的繁荣时期._______是我国史学的嬗变时期.2、_______和_______中的 描写开心的一件事的作文开头 70字 作文《校园一角》怎么写 廉政作文500字怎么写? 一束平行光的光源从地面上方沿竖直方向将光线向上投射到一面和它垂直的平面镜上,平面镜与地面的距离为3m,一束平行光的光源从地面上方沿竖直方向将光线向上投射到一面和它垂直的平面 写校园一角的作文写花坛里的植物(按四季(一季写一种) 关于校园一角的作文 一束光从地面上一点A沿竖直方向投射到一块水平放置的平面镜上,平面镜距地面4m,如果把平面镜以入射点o为中心顺时针旋转30度,地面上得到的光斑距A点多少米 校园一角怎么写?要写港头中心小学 《中国传统文化概论》作业:谈一下对中国传统文化的认识比如谈下对具体的典籍的某本书或某一方面问题的认识.注意引用文献,不少于800字. 一束细光从地面A处竖直向上投射到一块与它垂直的平面镜上,平面镜离地3M,如果把平面镜沿水平方向转过30°角地面上的光斑距离A出多远?(初二物理) 描写校园一角的作文 廉洁走进校园"作文,800字左右 如图,一束细小的平行光从地面A处沿竖直方向向上投射到一块跟他垂直的平面镜上 什么样的感觉真好作文400字 下图是使用1:500比例尺绘制的一块三角形的学校花园平面图,请你量出数据,在计算出这块地的实际面积4cm,底3cm.老师算50平方米 物理学中电池(电源)用什么符号表示? 有·····的感觉真好 (初三作文600字) 下图是用1:4000的比例尺画出的一块稻田平面图.它的实际面积是多少平方米?上底8 高6 下底15 单位cm是个梯形 在直径为5米的圆形花坛边缘,围绕着一条宽0.8米的环形小路,这条小路的面积是多少平方米? 《放假,感觉真好》 作文 怎样校园里写的芒果树的作文 绕一个直径为5米的圆形花坛修一条宽0.8米的环形小路,这条小路的面积为多少? 一束光线和水平面成30·,若使其经一平面镜反射后,反射光线沿水平方向射出,则镜面与水平面的夹角为 或 有关借物喻人 芒果树旳作文借物喻人 芒果树 作文 一束光a斜射到两个互相垂直和互相平行的平面镜上,请画出最终反射出去的光的方向 《放假,感觉真好》作文 500字左右 中国传统文化概论急求以下简答题答案:1.地理、气候环境对中国传统文化的影响有哪些?2.古代社会政治环境对中国传统文化的影响有哪些?3.中国传统文化的主要特点是什么?4.简述儒家的人 以《最快乐的事》为题写一个精彩的开头和结尾快 七月的天山是按照什么的顺序描写的 芒果树和芒果树的种植请问江西的南昌能种植芒果树和芒果树吗?有什么要注意的?现在种能成活么? 四年级作文校园一角范文 一次有趣的课 作文要新颖点的材料 不许抄袭 以廉洁在我心写一篇800字以上的作文不要初中生的作文,我读大一的,不要抄袭的,只有二十分,拜托帮我下,尽快啊,过几天就要教了 一束平行光从地面A处沿竖直方向向上投射到一块跟他垂直的平面镜上,平面镜距离地面4m,如果把平面镜在竖直面内沿水平轴转过30°,地面上得到的光斑距A点多远? 一束平行光线与水平面成20度角射向地面,现用平面镜使反射光线平面射出,则镜面与水平方向成的夹角要有图形的 花园长200m,在平面图用4cm长的线段来表示,这幅图的比例尺是( 如图所示,一块水平放置的平面镜m,与地面的距离是2米,一束光从地面上s点沿竖直方向将光线so投射到平面镜m上,若将平面镜转动一个角度,则反射光线在地面上的光斑由s点移到s‘点,测的ss’=2 一束平行光线与水平面成20度角射向地面,现用平面镜使反射光线进入一竖井中,镜面与水平方向成的角应是多少?备选答案有:30度 35度 45度 55度 关于文化传统与教育哲学的论文我现在上的课是 文化传统与教育哲学 老师留了作业就是以“文化传统与教育哲学”为话题写2000字的论文 没了`~ 对教师的教育组织策略的评价方式: 物理题当入射光线与平面镜夹角为20度,若保持入射光线方向不变,转动平面镜,使入射光与平面镜夹角为50度当入射光线与平面镜夹角为20度,若保持入射光线方向不变,转动平面镜,使入射光与平 今天下午,李明和赵亮争夺冠亚军.修改病句 答滴好再加悬赏 求作文《XXX的感觉真好》 600字以上,以记叙为主 求一个代表廉洁自立的短文,500字左右 赵亮和王军两人同时从甲村出发去乙村,赵亮的速度为每小时9千米,王军的速度为每小时15千米,王军因有事在途中停留了1.5小时 ,因此比赵亮迟到0.5小时,求甲乙两村的距离,若设甲乙两村的距离 XXX感觉真好作文~500字左右 廉洁书信进家庭500字作文高手来 在一幅公园的平面图上,用10厘米的距离表示实际100米的距离.求这幅平面图的比例尺拜托各位了 3Q 如下图,三角形ABC的面积为72cm²,点D在线段AC上,点F在线段BC的延长线,BC=2CF,且DCFE是平行四边形.阴影部分的面积是( )cm² ‍‍‍ 一节有趣的作文课作文 赵亮比弟弟大3岁,而赵亮的弟弟是5月出生的.他的年龄的2倍加上9.正好是出生那个月的总天数,求赵亮弟弟的年龄?方程,步骤及结果,thanks!
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘