Inno Setup设置NT服务
原文地址:http://stackoverflow.com/questions/16922272/unknown-identifier-and-wpselectdir
// Variables Globales
var
TimeZone: String;
type
SERVICE_STATUS = record
dwServiceType : cardinal;
dwCurrentState : cardinal;
dwControlsAccepted : cardinal;
dwWin32ExitCode : cardinal;
dwServiceSpecificExitCode : cardinal;
dwCheckPoint : cardinal;
dwWaitHint : cardinal;
end;
HANDLE = cardinal; const
SERVICE_QUERY_CONFIG = $;
SERVICE_CHANGE_CONFIG = $;
SERVICE_QUERY_STATUS = $;
SERVICE_START = $;
SERVICE_STOP = $;
SERVICE_ALL_ACCESS = $f01ff;
SC_MANAGER_ALL_ACCESS = $f003f;
SERVICE_WIN32_OWN_PROCESS = $;
SERVICE_WIN32_SHARE_PROCESS = $;
SERVICE_WIN32 = $;
SERVICE_INTERACTIVE_PROCESS = $;
SERVICE_BOOT_START = $;
SERVICE_SYSTEM_START = $;
SERVICE_AUTO_START = $;
SERVICE_DEMAND_START = $;
SERVICE_DISABLED = $;
SERVICE_DELETE = $;
SERVICE_CONTROL_STOP = $;
SERVICE_CONTROL_PAUSE = $;
SERVICE_CONTROL_CONTINUE = $;
SERVICE_CONTROL_INTERROGATE = $;
SERVICE_STOPPED = $;
SERVICE_START_PENDING = $;
SERVICE_STOP_PENDING = $;
SERVICE_RUNNING = $;
SERVICE_CONTINUE_PENDING = $;
SERVICE_PAUSE_PENDING = $;
SERVICE_PAUSED = $; // #######################################################################################
// nt based service utilities
// ####################################################################################### function OpenSCManager(lpMachineName, lpDatabaseName: string; dwDesiredAccess :cardinal): HANDLE;
external 'OpenSCManagerA@advapi32.dll stdcall'; function OpenService(hSCManager :HANDLE;lpServiceName: string; dwDesiredAccess :cardinal): HANDLE;
external 'OpenServiceA@advapi32.dll stdcall'; function CloseServiceHandle(hSCObject :HANDLE): boolean;
external 'CloseServiceHandle@advapi32.dll stdcall'; function CreateService(hSCManager :HANDLE;lpServiceName, lpDisplayName: string;dwDesiredAccess,dwServiceType,dwStartType,dwErrorControl: cardinal;lpBinaryPathName,lpLoadOrderGroup: String; lpdwTagId : cardinal;lpDependencies,lpServiceStartName,lpPassword :string): cardinal;
external 'CreateServiceA@advapi32.dll stdcall'; function DeleteService(hService :HANDLE): boolean;
external 'DeleteService@advapi32.dll stdcall'; function StartNTService(hService :HANDLE;dwNumServiceArgs : cardinal;lpServiceArgVectors : cardinal) : boolean;
external 'StartServiceA@advapi32.dll stdcall'; function ControlService(hService :HANDLE; dwControl :cardinal;var ServiceStatus :SERVICE_STATUS) : boolean;
external 'ControlService@advapi32.dll stdcall'; function QueryServiceStatus(hService :HANDLE;var ServiceStatus :SERVICE_STATUS) : boolean;
external 'QueryServiceStatus@advapi32.dll stdcall'; function QueryServiceStatusEx(hService :HANDLE;ServiceStatus :SERVICE_STATUS) : boolean;
external 'QueryServiceStatus@advapi32.dll stdcall'; function OpenServiceManager() : HANDLE;
begin
if UsingWinNT() = true then
begin
Result := OpenSCManager('','ServicesActive',SC_MANAGER_ALL_ACCESS);
if Result = then
MsgBox('the servicemanager is not available', mbError, MB_OK)
end
else
begin
MsgBox('only nt based systems support services', mbError, MB_OK)
Result := ;
end
end; function IsServiceInstalled(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> then begin
hService := OpenService(hSCM,ServiceName,SERVICE_QUERY_CONFIG);
if hService <> then begin
Result := true;
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end
end; function InstallService(FileName, ServiceName, DisplayName, Description : string;ServiceType,StartType :cardinal) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> then begin
hService := CreateService(hSCM,ServiceName,DisplayName,SERVICE_ALL_ACCESS,ServiceType,StartType,,FileName,'',,'','','');
if hService <> then begin
Result := true;
// Win2K & WinXP supports aditional description text for services
if Description<> '' then
RegWriteStringValue(HKLM,'System\CurrentControlSet\Services' + ServiceName,'Description',Description);
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end
end; function RemoveService(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> then begin
hService := OpenService(hSCM,ServiceName,SERVICE_DELETE);
if hService <> then begin
Result := DeleteService(hService);
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end
end; function StartService(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> then begin
hService := OpenService(hSCM,ServiceName,SERVICE_START);
if hService <> then begin
Result := StartNTService(hService,,);
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end;
end; function StopService(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
Status : SERVICE_STATUS;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> then begin
hService := OpenService(hSCM,ServiceName,SERVICE_STOP);
if hService <> then begin
Result := ControlService(hService,SERVICE_CONTROL_STOP,Status);
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end;
end; function IsServiceRunning(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
Status : SERVICE_STATUS;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> then begin
hService := OpenService(hSCM,ServiceName,SERVICE_QUERY_STATUS);
if hService <> then begin
if QueryServiceStatus(hService,Status) then begin
Result :=(Status.dwCurrentState = SERVICE_RUNNING)
end;
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end
end; // #######################################################################################
// create an entry in the services file
// #######################################################################################
function SetupService(service, port, comment: string) : boolean;
var
filename : string;
s : string;
lines : TArrayOfString;
n : longint;
i : longint;
errcode : integer;
servnamlen : integer;
error : boolean;
begin
if UsingWinNT() = true then
filename := ExpandConstant('{sys}\drivers\etc\services')
else
filename := ExpandConstant('{win}\services'); if LoadStringsFromFile(filename,lines) = true then begin
Result := true;
n := GetArrayLength(lines) - ;
servnamlen := Length(service);
error := false; for i:= to n do begin
if Copy(lines[i],,) <> '#' then begin
s := Copy(lines[i],,servnamlen);
if CompareText(s,service) = then
exit; // found service-entry if Pos(port,lines[i]) > then begin
error := true;
lines[i] := '#' + lines[i] + ' # disabled because collision with ' + service + ' service';
end;
end
else if CompareText(Copy(lines[i],,servnamlen),service) = then begin
// service-entry was disabled
Delete(lines[i],,);
Result := SaveStringsToFile(filename,lines,false);
exit;
end;
end; if error = true then begin
// save disabled entries
if SaveStringsToFile(filename,lines,false) = false then begin
Result := false;
exit;
end;
end; // create new service entry
s := service + ' ' + port + ' # ' + comment + ##;
if SaveStringToFile(filename,s,true) = false then begin
Result := false;
exit;
end; if error = true then begin
MsgBox('the ' + service + ' port was already used. The old service is disabled now. You should check the services file manually now.',mbInformation,MB_OK);
//InstExec('notepad.exe',filename,GetCurrentDir(),true,false,SW_SHOWNORMAL,errcode);
end;
end
else
Result := false;
end; // #######################################################################################
// version functions
// #######################################################################################
function CheckVersion(Filename : string;hh,hl,lh,ll : integer) : boolean;
var
VersionMS : cardinal;
VersionLS : cardinal;
CheckMS : cardinal;
CheckLS : cardinal;
begin
if GetVersionNumbers(Filename,VersionMS,VersionLS) = false then
Result := false
else begin
CheckMS := (hh shl $) or hl;
CheckLS := (lh shl $) or ll;
Result := (VersionMS > CheckMS) or ((VersionMS = CheckMS) and (VersionLS >= CheckLS));
end;
end; // Some examples for version checking
function NeedShellFolderUpdate() : boolean;
begin
Result := CheckVersion('ShFolder.dll',,,,) = false;
end; function NeedVCRedistUpdate() : boolean;
begin
Result := (CheckVersion('mfc42.dll',,,,) = false)
or (CheckVersion('msvcrt.dll',,,,) = false)
or (CheckVersion('comctl32.dll',,,,) = false);
end; function NeedHTMLHelpUpdate() : boolean;
begin
Result := CheckVersion('hh.exe',,,,) = false;
end; function NeedWinsockUpdate() : boolean;
begin
Result := (UsingWinNT() = false) and (CheckVersion('mswsock.dll',,,,) = false);
end; function NeedDCOMUpdate() : boolean;
begin
Result := (UsingWinNT() = false) and (CheckVersion('oleaut32.dll',,,,) = false);
end; // #######################################################################################
// Replace substring in a string functions
// #######################################################################################
procedure FileReplace(SrcFile, sFrom, sTo: String);
var
FileContent: String;
begin
//Load srcfile to a string
LoadStringFromFile(SrcFile, FileContent);
//Replace Fraomstring by toString in file string content
StringChange (sTo,'/', '\');
StringChange (FileContent, sFrom, sTo);
//Replace old content srcfile by the new content
DeleteFile(SrcFile);
SaveStringToFile(SrcFile,FileContent, True);
end; // #######################################################################################
// Replace in file functions
// #######################################################################################
procedure FileWrite(SrcFile, sFrom, sTo: String);
var
FileContent: String;
begin
//Load srcfile to a string
LoadStringFromFile(SrcFile, FileContent);
//Replace Fraomstring by toString in file string content
//StringChange (sTo,'/', '\');
StringChange (FileContent, sFrom, sTo);
//Replace old content srcfile by the new content
DeleteFile(SrcFile);
SaveStringToFile(SrcFile,FileContent, True);
end; // #######################################################################################
// Custumized page for apache config
// #######################################################################################
procedure CreateTheWizardPages;
// variables locales
var
Lbl: TLabel;
Page: TWizardPage;
Edit: TEdit;
PortNbr: String;
// boites
begin
Page := CreateCustomPage(wpSelectComponents, 'Apache configuration', 'Please enter your parameter for the apache server (Default is 80)');
Lbl := TLabel.Create(Page);
Lbl.Top := ScaleY();
Lbl.Caption := 'Apache server port :';
Lbl.AutoSize := True;
Lbl.Parent := Page.Surface; Edit := TEdit.Create(Page);
Edit.Top := ScaleY();
Edit.Left := Lbl.Left + ScaleX();
Edit.Width := Page.SurfaceWidth div - ScaleX();
Edit.Text := PortNbr;
Edit.Text := '';
Edit.Parent := Page.Surface;
end; // #######################################################################################
// Custumized page for Password enter
// #######################################################################################
procedure CreateTheWizardPagesPwd;
// variables locales
var
PasWd: TLabel;
PagePwd: TWizardPage;
EditPw: TEdit;
//MailHostName: String;
// boites
begin
PagePwd := CreateCustomPage(wpSelectComponents, 'Password for the data base user', 'Please enter the password for the data base');
PasWd := TLabel.Create(PagePwd);
PasWd.Top := ScaleY();
PasWd.Caption := 'PassWord : ';
PasWd.AutoSize := True;
PasWd.Parent := PagePwd.Surface; EditPw := TEdit.Create(PagePwd);
EditPw.Top := ScaleY();
EditPw.Left := PasWd.Left + ScaleX();
EditPw.Width := PagePwd.SurfaceWidth div - ScaleX();
EditPw.Parent := PagePwd.Surface;
end; // #######################################################################################
// Custumized page for Enter the path of the backup file
// #######################################################################################
procedure CreateTheWizardPagesBkpDir;
var
PageBkpDir: TInputDirWizardPage;
// boites
begin
PageBkpDir := CreateInputDirPage(wpSelectDir,'Select Backup Data Directory','Where should Backup data files be installed?','Select the folder in which Setup should copy backup data files, then click Next.', False, '');
PageBkpDir.Add('');
PageBkpDir.Values[] := ExpandConstant('{userdesktop}\dbBackup');
end; // #######################################################################################
// Custumized page for Time zone enter
// #######################################################################################
procedure CreateTheWizardPagesTimeZone;
// variables locales
var
Panel: TPanel;
PageTimeZone: TWizardPage;
ListBTimeZone: TNewListBox;
// boites
begin
PageTimeZone := CreateCustomPage(wpWelcome, 'Time zone of your location', 'Please choose your time zone');
Panel := TPanel.Create(PageTimeZone);
Panel.Width := PageTimeZone.SurfaceWidth div - ScaleX();
Panel.Left := PageTimeZone.SurfaceWidth - Panel.Width;
Panel.Caption := 'TPanel';
Panel.Color := clWindow;
Panel.ParentBackground := False;
Panel.Parent := PageTimeZone.Surface; ListBTimeZone := TNewListBox.Create(PageTimeZone);
ListBTimeZone.Width := PageTimeZone.SurfaceWidth;
ListBTimeZone.Height := ScaleY();
ListBTimeZone.Parent := PageTimeZone.Surface;
ListBTimeZone.Items.Add('Etc/UTC');
ListBTimeZone.Items.Add('Europe/Paris');
ListBTimeZone.ItemIndex := ;
end; // Initialisation
procedure InitializeWizard();
begin
CreateTheWizardPages;
CreateTheWizardPagesTimeZone;
CreateTheWizardPagesPwd;
CreateTheWizardPagesBkpDir;
end; // #######################################################################################
// Function to stop and delete de service by uninstallation procedur
// #######################################################################################
procedure CurUninstallStepChanged(CurStep: TUninstallStep);
var
ErrorCode: Integer;
begin
if CurStep = usUninstall then
begin
//Uninstall process
ShellExec('open','taskkill.exe','/f /im MyApplicationService.exe','',SW_HIDE,ewNoWait,ErrorCode);
ShellExec('open','taskkill.exe','/f /im httpd.exe','',SW_HIDE,ewNoWait,ErrorCode);
ShellExec('open','taskkill.exe','/f /im mysqld.exe','',SW_HIDE,ewNoWait,ErrorCode); // stop all affected services
StopService('MyApplicationService');
StopService('MySqld');
StopService('Apache'); // remove all affected services
RemoveService('MyApplicationService');
RemoveService('MySqld');
RemoveService('Apache');
end;
end; // #######################################################################################
// Function to check and replace the string in the file at the end of the installation
// #######################################################################################
procedure CurStepChanged(CurStep: TSetupStep);
var
ErrorCode: Integer;
WorkingDir: String;
PathOfDir: String;
begin
//juste aprés installation
if CurStep = ssPostInstall then
begin
PathOfDir := GetShortName(PathOfDir2);
FileReplace(ExpandConstant('{app}\create_db.sql'), '@@Pwd@@', EditPw.Text); FileReplace(ExpandConstant('{app}\webserver\bin\apache\Apache2.2.22\conf\httpd.conf'), '@@Port@@', PortNbr);
FileReplace(ExpandConstant('{app}\webserver\bin\apache\Apache2.2.22\conf\httpd.conf'), '@@Path@@', PathOfDir+'\webserver');
FileReplace(ExpandConstant('{app}\webserver\bin\apache\Apache2.2.22\bin\php.ini'), '@@Path@@', PathOfDir+'\webserver');
FileWrite(ExpandConstant('{app}\webserver\bin\apache\Apache2.2.22\bin\php.ini'), '@@TimeZone@@', TimeZone); FileReplace(ExpandConstant('{app}\webserver\bin\mysql\mysql5.5.24\my.ini'), '@@Path@@', PathOfDir+'\webserver');
FileReplace(ExpandConstant('{app}\webserver\bin\mysql\mysql5.5.24\bin\dbexport.bat'), '@@Path@@', PathOfBackupDir);
FileReplace(ExpandConstant('{app}\webserver\bin\mysql\mysql5.5.24\bin\create_db.bat'), '@@Path@@', PathOfDir + '\webserver\bin\mysql\mysql5.5.24');
FileReplace(ExpandConstant('{app}\webserver\bin\mysql\mysql5.5.24\bin\create_db.bat'), '@@PathOfDir@@', PathOfDir); FileReplace(ExpandConstant('{app}\webserver\bin\php\php5.4.3\php.ini'), '@@Path@@', PathOfDir+'\webserver');
FileReplace(ExpandConstant('{app}\webserver\bin\php\php5.4.3\phpForApache.ini'), '@@Path@@', PathOfDir+'\webserver'); if InstallService(ExpandConstant('"{app}\webserver\bin\mysql\mysql5.5.24\bin\mysqld.exe" MySqld'),'MySqld','MySqld','The mysql service',SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START) = true then
begin
StartService('MySqld');
Sleep();
end
else
MsgBox('MySqld service could not be installed',mbInformation, MB_OK); if InstallService(ExpandConstant('"{app}\webserver\bin\apache\apache2.2.22\bin\httpd.exe" -k runservice'),'Apache','Apache','The apache service',SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START) = true then
begin
StartService('Apache');
Sleep();
end
else
MsgBox('Apache service could not be installed',mbInformation, MB_OK); if InstallService(ExpandConstant('"{app}\MyApplicationService.exe"'),'MyApplicationService','MyApplicationService','The server',SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START) = true then
begin
StartService('MyApplicationService');
Sleep();
end
else
MsgBox('The MyApplicationService service could not be installed',mbInformation, MB_OK); end; if CurStep = ssInstall then
begin
//Uninstall process
ShellExec('open','taskkill.exe','/f /im MyApplicationService.exe','',SW_HIDE,ewNoWait,ErrorCode);
ShellExec('open','taskkill.exe','/f /im httpd.exe','',SW_HIDE,ewNoWait,ErrorCode);
ShellExec('open','taskkill.exe','/f /im mysqld.exe','',SW_HIDE,ewNoWait,ErrorCode); // stop all affected services
StopService('MyApplicationService');
StopService('MySqld');
StopService('Apache'); // remove all affected services
RemoveService('MyApplicationService');
RemoveService('MySqld');
RemoveService('Apache');
end; if CurStep = ssDone then
begin
Exec(ExpandConstant('{app}\webserver\bin\mysql\mysql5.5.24\bin\create_db.bat'),'','', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
end;
end; // #######################################################################################
// Function to check the values entered
// #######################################################################################
function NextButtonClick(CurPageID: Integer): Boolean;
var
ErrorCode: Integer;
begin
Result := True;
case CurPageID of
Page.ID:
begin
if (Edit.Text = '') then
begin
MsgBox('Port number check:'## 'The port number is empty. The default port << 80 >> will be applied. Please click on the back button to change if needed ', mbError, MB_OK);
Edit.Text := '';
end
else
begin
Result := True;
PortNbr := Edit.Text;
end
end;
//End page.id PagesEmailSt.ID:
begin
if (EditPwd.Text = EditPwd2.Text) then
begin
MailHostName := EditMailHostName.Text;
MailUserName := EditUserName.Text;
MailPwd := EditPwd.Text;
MailFrom := EditFromMail.Text;
MailSmtpPort := EditSmtpPort.Text;
end
else
begin
MsgBox('Password check:'## 'The password entered is not the same. Please click on back and check ', mbError, MB_OK);
Result := false;
end
end;
//End PagesEmailSt.id //Time zone add beginn
PageTimeZone.ID:
begin
Result := false;
TimeZone := ListBTimeZone.Items.Strings[ListBTimeZone.ItemIndex];
end;
//End time zone add //Beginn dir selector
PageBkpDir.ID:
begin
//PageBkpDir.Values[0] := ExpandConstant('{userdesktop}\dbBackup');
PathOfBackupDir := PageBkpDir.Values[];
end; wpSelectDir:
begin
PathOfDir2 := WizardDirValue;
//MsgBox('NextButtonClick:' #13#13 'You selected: ''' + PathOfDir + '''.', mbInformation, MB_OK);
end;
//End dir selector
end; //End case
Result := True;
end; function GetDataDir(Param: String): String;
begin
//Return the selected DataDir
Result := PageBkpDir.Values[];
end;
Inno Setup设置NT服务的更多相关文章
- Inno Setup设置在安装Finished页面,点击finish后打开网页
在安装的最后一个页面FinishPage中点击Finished然后打开一个网页 这个功能貌似很简单,不就是在点击finish按钮给它绑定事件,问题立马解决. 在普通的桌面应用程序开发中的确是这样做的, ...
- Inno Setup 设置开机启动
案1: 将快捷方式添加到“启动”文件夹 [Tasks] Name: "startupicon"; Description: "{cm:CreateQuickLaunchI ...
- [!!!!!]Inno Setup教程-常见问题解答
[转]Inno Setup教程-常见问题解答 功能 * 翻译 Inno Setup 文字 * 它支持 MBCS (多字节字符集) 吗? * 将来会支持 Windows Installer 吗? ...
- Inno Setup 安装、卸载前检测进程或服务
[转载]Inno Setup 安装.卸载前检测进程或服务 (2015-04-24 17:37:20) 转载▼ 标签: 转载 原文地址:Inno Setup 安装.卸载前检测进程或服务作者:一去丶二 ...
- inno setup介绍及官方网站地址
使 用 笔 记 1.Inno Setup 是什么?Inno Setup 是一个免费的 Windows 安装程序制作软件.第一次发表是在 1997 年,Inno Setup 今天在功能设置和稳定性上的竞 ...
- Inno Setup的常用脚本
Inno Setup的常用脚本 分类: VC++神奇理论 2012-12-06 10:07 3234人阅读 评论(2) 收藏 举报 安装不同的目录: [Files] Source: "我的程 ...
- Inno Setup脚本语法大全
Inno Setup脚本语法大全 ResourceShare Bruce 11个月前 (10-28) 6136浏览 0评论 Inno Setup 是什么?Inno Setup 是一个免费的 Win ...
- Inno Setup for Windows service
Inno Setup for Windows service? up vote86down votefavorite 77 I have a .Net Windows service. I want ...
- Inno Setup 使用笔记
使 用 笔 记https://blog.csdn.net/dongshibo12/article/details/79095971 1.Inno Setup 是什么?Inno Setup 是一个免费的 ...
随机推荐
- oracle中where 子句和having子句中的区别
1.where 不能放在GROUP BY 后面 2.HAVING 是跟GROUP BY 连在一起用的,放在GROUP BY 后面,此时的作用相当于WHERE 3.WHERE 后面的条件中不能有聚集函数 ...
- mvn 命令
mvn eclipse:eclipse 用mvn把文件转化成eclipse支持的文件 mvn install 打包jar,放到本地仓库 ,在打包的时候还会执行单元测试,不需要的话运行(不需要打入 ...
- 转:java日志组件介绍(common-logging,log4j,slf4j,logback )
原网址:http://www.blogjava.net/daiyongzhi/archive/2014/04/13/412364.html common-logging common-logging是 ...
- [Hibernate] - Annotations
Hibernate使用Annotations最简单例子: hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8 ...
- 程序员书单_HTML篇
JavaScript权威指南(第六版) http://download.csdn.net/detail/shenzhq1980/9137733 改善JavaScript程序的188个建议 http:/ ...
- jsoncpp用法通俗易懂之解析
刚工作不久,最近遇到一个要解析一个web服务器发过来的json格式的文件,文件如下: { "global": { "renew": "true&quo ...
- 【linux】locate介绍
Locale和everything 类似,有本地的检索库,它会自动更新检索库,但新创建的文件,不能用locale 查到,需要手动更新检索库update db 才能搜索到,在/tmp 目录下的文件不能搜 ...
- (转)VS.NET2010水晶报表安装部署[VS2010]
本文转载自:http://www.cnblogs.com/xiaofengfeng/p/3325793.html 欢迎C#高手加盟QQ群:9340166 水晶报表VS2010版IDE安装标准版SAP ...
- POM (Project Object Model)简介
1 概念介绍 一个项目所有的配置都放置在 POM 文件中:定义项目的类型.名字,管理依赖关系,定制插件的行为等等.比如说,你可以配置 compiler 插件让它使用 java1.5 来编译. < ...
- 在Java中使用Memcached(转)
memcache的Java客户端调用,在网上还是有些少,很多都是php的.如何要想用Java调用memcache的服务,首先要有客户端的支持,我们先下载一个客户端吧.下载地址:https://gith ...