用BCB做完了安装/卸载程序,把几个我觉得还可以的函数源码公布,希望对大家有点用

youngphoneix 2003-09-29 10:10:46
在做安装/卸载程序的过程中,我写了几个函数,把比较难用的WIN32 API封装了一
下,希望能对大家有点用吧!

1、快捷方式生成函数
所需头文件: #include <shlobj.h>
函数声明: void __fastcall CreateShortCut( AnsiString SetupPath,
AnsiString StartFolderName,
AnsiString ShortCutName,
AnsiString ExecuteName,
bool IsDesktop=true,
bool IsStart=true,
bool IsAutoRun=false );
函数实现:
//创建快捷方式
void __fastcall TfrmBeginSetup::CreateShortCut( AnsiString SetupPath,
AnsiString StartFolderName,
AnsiString ShortCutName,
AnsiString ExecuteName,
bool IsDesktop, bool IsStart,
bool IsAutoRun )
{
IShellLink* pLink;
IPersistFile* pPersistFile;
LPMALLOC ShellMalloc;
LPITEMIDLIST DesktopPidl;
char DesktopDir[MAX_PATH];
AnsiString Name=ShortCutName, ExeName=ExecuteName, StartName="",
SetupDir=SetupPath;
StartName = StartFolderName;
if( SetupDir.SubString( (SetupDir.Length()-1),1 ) != "\\" )
SetupDir += "\\";

if( IsDesktop == true )
{
//创建桌面快捷方式
if(FAILED(SHGetMalloc(&ShellMalloc)))
return;

if(FAILED(SHGetSpecialFolderLocation(NULL,
CSIDL_DESKTOPDIRECTORY,
&DesktopPidl)))
return;

if(!SHGetPathFromIDList(DesktopPidl, DesktopDir))
{
ShellMalloc->Free(DesktopPidl);
ShellMalloc->Release();
return;
}

ShellMalloc->Free(DesktopPidl);
ShellMalloc->Release();
if(SUCCEEDED(CoInitialize(NULL)))
{
if(SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER,
IID_IShellLink, (void **) &pLink)))
{
pLink->SetShowCmd(SW_SHOW);
pLink->SetDescription( Name.c_str() );
AnsiString newpath = SetupDir + ExeName;
pLink->SetPath(newpath.c_str());

if(SUCCEEDED(pLink->QueryInterface(IID_IPersistFile,
(void **) &pPersistFile)))
{
WideString strShortCutLocation(DesktopDir);
strShortCutLocation += "\\" + Name + ".lnk";
Desktop = strShortCutLocation;
pPersistFile->Save(strShortCutLocation.c_bstr(), TRUE);
pPersistFile->Release();
}
pLink->Release();
}
CoUninitialize();
}
} //end IsDesktop if


if( IsStart == true )
{
//在程序组中创建快捷方式
if(FAILED(SHGetMalloc(&ShellMalloc)))
return;

if(FAILED(SHGetSpecialFolderLocation(NULL,
CSIDL_PROGRAMS,
&DesktopPidl)))
return;

if(!SHGetPathFromIDList(DesktopPidl, DesktopDir))
{
ShellMalloc->Free(DesktopPidl);
ShellMalloc->Release();
return;
}

ShellMalloc->Free(DesktopPidl);
ShellMalloc->Release();
if(SUCCEEDED(CoInitialize(NULL)))
{
if(SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER,
IID_IShellLink, (void **) &pLink)))
{
pLink->SetShowCmd(SW_SHOW);
pLink->SetDescription( Name.c_str() );
AnsiString newpath = SetupDir + ExeName;
pLink->SetPath(newpath.c_str());

if(SUCCEEDED(pLink->QueryInterface(IID_IPersistFile,
(void **) &pPersistFile)))
{
WideString strShortCutLocation(DesktopDir);
Start = strShortCutLocation;

//如果StartFolderName != NULL,则在程序组下创建子菜单
if( StartName != "" )
{
if( StartName.SubString(0,1) != "\\" )
strShortCutLocation += "\\";
strShortCutLocation += StartName;
ForceDirectories( strShortCutLocation );
}

strShortCutLocation += "\\" + Name +".lnk";
pPersistFile->Save(strShortCutLocation.c_bstr(), TRUE);
pPersistFile->Release();
}
}
pLink->Release();
CoUninitialize();
}
} //end IsStart if


if( IsAutoRun == true )
{
//程序自动启动
if(FAILED(SHGetMalloc(&ShellMalloc)))
return;

if(FAILED(SHGetSpecialFolderLocation(NULL,
CSIDL_STARTUP,
&DesktopPidl)))
return;

if(!SHGetPathFromIDList(DesktopPidl, DesktopDir))
{
ShellMalloc->Free(DesktopPidl);
ShellMalloc->Release();
return;
}

ShellMalloc->Free(DesktopPidl);
ShellMalloc->Release();
if(SUCCEEDED(CoInitialize(NULL)))
{
if(SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER,
IID_IShellLink, (void **) &pLink)))
{
pLink->SetShowCmd(SW_SHOW);
pLink->SetDescription( Name.c_str() );
AnsiString newpath = SetupDir + ExeName;
pLink->SetPath(newpath.c_str());

if(SUCCEEDED(pLink->QueryInterface(IID_IPersistFile,
(void **) &pPersistFile)))
{
WideString strShortCutLocation(DesktopDir);
strShortCutLocation += "\\" + Name +".lnk";
pPersistFile->Save(strShortCutLocation.c_bstr(), TRUE);
pPersistFile->Release();
}
pLink->Release();
}
CoUninitialize();
}
} //end IsAutoRun if

}

说明一下,第一个参数是安装文件的所在目录;第二个是创建“开始-程序”快捷方
式的文件目录,也可以设置为NULL,则不创建目录;第三个是快捷方式的名称;第
四个是和快捷方式相关联的执行文件;后面三个预设了值的BOOL参数,分别表示
是否需要创建桌面、开始-程序组快捷,以及是否自动启动。


...全文
69 70 打赏 收藏 转发到动态 举报
写回复
用AI写文章
70 条回复
切换为时间正序
请发表友善的回复…
发表回复
warton 2003-12-15
  • 打赏
  • 举报
回复
安装后加到控制面板的添加/删除程序列表中???


很简单,修改注册表!!
vargent77 2003-12-15
  • 打赏
  • 举报
回复
up
crzman37 2003-12-10
  • 打赏
  • 举报
回复
爽快,以后我多像大家学习你们这种精神,我现在在搞一个远程监控功放的项目,就是通过RS232串口控制一二公里
lovebcb 2003-12-05
  • 打赏
  • 举报
回复
印上脚印!
lansb1 2003-12-05
  • 打赏
  • 举报
回复
谢谢楼主.
收藏.
kingcaiyao 2003-12-05
  • 打赏
  • 举报
回复
上面的代码并不困难,无非是对注删表操作,关键问题是如何将程序安装后加到控制面板的添加/删除程序列表中???
「已注销」 2003-12-05
  • 打赏
  • 举报
回复
学习
gpg 2003-12-02
  • 打赏
  • 举报
回复
好文
楼主的慷慨带来大家的慷慨。

youngphoneix (雪里红) 的砖,warton(Thinking IN Change)的玉。

这块砖不是别的砖,是秦砖汉瓦的砖。
这个玉不是和氏碧(和氏碧只有上等人才能看的),是小家碧玉的玉。

warton(Thinking IN Change)来了一段,Wingsun也该来一段。
yanjing01 2003-12-01
  • 打赏
  • 举报
回复
好呀,很是感谢搂主!
极速小王子 2003-12-01
  • 打赏
  • 举报
回复
做个 记号!
叶子哟 2003-11-28
  • 打赏
  • 举报
回复
好呀
zhvickie 2003-11-28
  • 打赏
  • 举报
回复
warton能解释一下几个函数的用途吗
zhvickie 2003-11-28
  • 打赏
  • 举报
回复
好长啊。
能不能给个完整的例子下载啊
支持
wangxd 2003-11-28
  • 打赏
  • 举报
回复
用installshield全都可以解决
warton 2003-11-28
  • 打赏
  • 举报
回复

//判断操作系统

//§PÂ_¾Þ§@¨t²Î
typedef enum tagWin32SysType{
Windows32s,
WindowsNT3,
Windows95,
Windows98,
WindowsME,
WindowsNT4,
Windows2000,
WindowsXP
}Win32SysType;



//§PÂ_¾Þ§@¨t²Î²[¼Æ¤ÎÅܶq¡Ajingzhou xu

Win32SysType IsShellSysType()
{
Win32SysType ShellType;
DWORD winVer;
OSVERSIONINFO *osvi;
winVer=GetVersion();
if(winVer<0x80000000){/*NT */
ShellType=WindowsNT3;
osvi= (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));
if (osvi!=NULL){
memset(osvi,0,sizeof(OSVERSIONINFO));
osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(osvi);
if(osvi->dwMajorVersion==4L)ShellType=WindowsNT4;
else if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==0L)ShellType=Windows2000;
else if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==1L)ShellType=WindowsXP;
free(osvi);
}
}
else if (LOBYTE(LOWORD(winVer))<4)
ShellType=Windows32s;
else{
ShellType=Windows95;
osvi= (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));
if (osvi!=NULL){
memset(osvi,0,sizeof(OSVERSIONINFO));
osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(osvi);
if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==10L)ShellType=Windows98;
else if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==90L)ShellType=WindowsME;
free(osvi);
}
}
return ShellType;
}
warton 2003-11-28
  • 打赏
  • 举报
回复
#ifndef iSGuardFunctionsH
#define iSGuardFunctionsH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#ifdef __cplusplus
extern "C" {
#endif

//
// install nt service(exe,auto)
//
void __declspec(dllexport) iS_SetGuardParameter(AnsiString ServiceName,AnsiString Key,AnsiString Value);
void __declspec(dllexport) iS_InstallGuard(AnsiString ServiceName,AnsiString DisplayName,AnsiString ServicePath);
void __declspec(dllexport) iS_RemoveGuard(AnsiString ServiceName);
void __declspec(dllexport) iS_StartGuard(AnsiString ServiceName);
void __declspec(dllexport) iS_StopGuard(AnsiString ServiceName);

//
// install nt service(driver,auto)
//
void __declspec(dllexport) iS_SetDriverParameter(AnsiString ServiceName,AnsiString Key,AnsiString Value);
void __declspec(dllexport) iS_InstallDriver(AnsiString ServiceName,AnsiString DisplayName,AnsiString ServicePath);
void __declspec(dllexport) iS_RemoveDriver(AnsiString ServiceName);
void __declspec(dllexport) iS_StartDriver(AnsiString ServiceName);
void __declspec(dllexport) iS_StopDriver(AnsiString ServiceName);

//
// install 95 service(exe)
//
void __declspec(dllexport) iS_SetGuardParameter_9x(AnsiString ServiceName,AnsiString Key,AnsiString Value);
void __declspec(dllexport) iS_InstallGuard_9x(AnsiString ServiceName,AnsiString ServicePath );
void __declspec(dllexport) iS_RemoveGuard_9x(AnsiString ServiceName);
void __declspec(dllexport) iS_StartGuard_9x(AnsiString ServiceName);
void __declspec(dllexport) iS_StopGuard_9x(AnsiString ServiceName);
AnsiString __declspec(dllexport) iS_GetGuardDir_9x(AnsiString ServiceName);

//
// install 95 service(static-driver)
//
void __declspec(dllexport) iS_SetDriverParameter_9x(AnsiString ServiceName,AnsiString Key,AnsiString Value);
void __declspec(dllexport) iS_InstallDriver_9x(AnsiString ServiceName,AnsiString ServicePath );
void __declspec(dllexport) iS_RemoveDriver_9x(AnsiString ServiceName);

//
// install AutoRun(exe)
//
void __declspec(dllexport) iS_InstallAutoRun(AnsiString ServiceName,AnsiString ServicePath);
void __declspec(dllexport) iS_RemoveAutoRun(AnsiString ServiceName);

// indicates where the shortcut locates
enum ShortCutPosionType { POS_DESKTOP, POS_START_MENU, POS_PROG_MENU };
// indicates whether the shortcut could been seen by all users
enum ShortCutUserType { ALL_USER, CUR_USER };
//
// create and remove shortcuts
//
// shortcutName: the name of shortcut, exclude extension.
// destExe: the full path of the destination of this shortcut.
void __declspec(dllexport) iS_CreateGroup(
AnsiString groupName,
ShortCutPosionType pos,
ShortCutUserType user
);
void __declspec(dllexport) iS_RemoveGroup(
AnsiString groupName,
ShortCutPosionType pos,
ShortCutUserType user
);
void __declspec(dllexport) iS_CreateShortcut(
AnsiString groupName,
AnsiString shortcutName,
AnsiString destExe,
AnsiString hint,
ShortCutPosionType pos,
ShortCutUserType user
);
void __declspec(dllexport) iS_RemoveShortcut(
AnsiString groupName,
AnsiString shortcutName,
ShortCutPosionType pos,
ShortCutUserType user
);
//
// 9x?Nt,yes=95,no=nt
//
bool __declspec(dllexport) iS_SystemVersion();

#ifdef __cplusplus
}
#endif

//---------------------------------------------------------------------------

#endif //iSGuardFunctionsH
warton 2003-11-28
  • 打赏
  • 举报
回复
#include <Registry.hpp>
#include <shlobj.h>
#pragma hdrstop
//---------------------------------------------------------------------------

#include "iSGuardFunction.h"
//---------------------------------------------------------------------------

#pragma package(smart_init)
//---------------------------------------------------------------------------

void iS_SetGuardParameter(AnsiString ServiceName,AnsiString Key,AnsiString Value)
{
TRegistry* RegGuard = new TRegistry;
try
{
RegGuard->RootKey = HKEY_LOCAL_MACHINE; // Section of registry to look for
if(!RegGuard->OpenKey("\\SYSTEM\\CurrentControlSet\\Services\\"+ServiceName+"\\Parameters",true))
{
;
}
else
{
RegGuard->WriteString(Key,Value);
RegGuard->CloseKey();
}
}
__finally
{
delete RegGuard;
}
}
//---------------------------------------------------------------------------

void iS_InstallGuard(AnsiString ServiceName,AnsiString DisplayName,AnsiString ServicePath)
{
SC_HANDLE hSCManager, hService;

if((hSCManager = OpenSCManager(
NULL,
NULL,
SC_MANAGER_ALL_ACCESS)) == NULL)
{
return;
}

if ((hService = CreateService(hSCManager,
ServiceName.c_str(),
DisplayName.c_str(),
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_IGNORE,
ServicePath.c_str(),
NULL,
NULL,
NULL,
NULL,
NULL)) == NULL)
{
return;
}

CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
}
//---------------------------------------------------------------------------

void iS_RemoveGuard(AnsiString ServiceName)
{
SC_HANDLE hSCManager, hService;

if((hSCManager = OpenSCManager(
NULL,
NULL,
SC_MANAGER_ALL_ACCESS)) == NULL)
{
return;
}

if((hService=OpenService(
hSCManager,
ServiceName.c_str(),
SERVICE_ALL_ACCESS)) == NULL)
{
return;
}

DeleteService(hService);

CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
}
//---------------------------------------------------------------------------

void iS_StartGuard(AnsiString ServiceName)
{
SC_HANDLE hSCManager, hService;

if((hSCManager = OpenSCManager(
NULL,
NULL,
SC_MANAGER_ALL_ACCESS)) == NULL)
{
return;
}

if((hService=OpenService(
hSCManager,
ServiceName.c_str(),
SERVICE_ALL_ACCESS)) == NULL)
{
return;
}

StartService(hService,0,NULL);

CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
}
//---------------------------------------------------------------------------

void iS_StopGuard(AnsiString ServiceName)
{
SC_HANDLE hSCManager, hService;

if((hSCManager = OpenSCManager(
NULL,
NULL,
SC_MANAGER_ALL_ACCESS)) == NULL)
{
return;
}

if((hService=OpenService(
hSCManager,
ServiceName.c_str(),
SERVICE_ALL_ACCESS)) == NULL)
{
return;
}

SERVICE_STATUS SS;
ControlService(hService,SERVICE_CONTROL_STOP,&SS);

CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
}
//---------------------------------------------------------------------------

void iS_InstallAutoRun(AnsiString ServiceName,AnsiString ServicePath )
{
//HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run
//
AnsiString SubKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
TRegistry* Reg = new TRegistry;
try
{
Reg->RootKey = HKEY_LOCAL_MACHINE; // Section of registry to look for
if (!Reg->OpenKey(SubKey,false) )
;//ShowMessage("Error Opening/Creating key");
else
{
Reg->WriteString(ServiceName,ServicePath);

Reg->CloseKey();
}
}
__finally
{
delete Reg;
}
}
warton 2003-11-28
  • 打赏
  • 举报
回复

//---------------------------------------------------------------------------

void iS_RemoveAutoRun(AnsiString ServiceName)
{
//HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run
//
AnsiString SubKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
TRegistry* Reg = new TRegistry;
try
{
Reg->RootKey = HKEY_LOCAL_MACHINE; // Section of registry to look for
if (!Reg->OpenKey(SubKey,false) )
;//ShowMessage("Error Opening/Creating key");
else
{
Reg->DeleteValue(ServiceName);

Reg->CloseKey();
}
}
__finally
{
delete Reg;
}
}
//---------------------------------------------------------------------------

void iS_InstallDriver(AnsiString ServiceName,AnsiString DisplayName,AnsiString ServicePath)
{
SC_HANDLE hSCManager, hService;

if((hSCManager = OpenSCManager(
NULL,
NULL,
SC_MANAGER_ALL_ACCESS)) == NULL)
{
return;
}

if ((hService = CreateService(hSCManager,
ServiceName.c_str(),
DisplayName.c_str(),
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_SYSTEM_START,//fix,sunwang,2003-10-13
SERVICE_ERROR_IGNORE,
ServicePath.c_str(),
NULL,
NULL,
NULL,
NULL,
NULL)) == NULL)
{
return;
}

CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
}
//---------------------------------------------------------------------------

void iS_RemoveDriver(AnsiString ServiceName)
{
SC_HANDLE hSCManager, hService;

if((hSCManager = OpenSCManager(
NULL,
NULL,
SC_MANAGER_ALL_ACCESS)) == NULL)
{
return;
}

if((hService=OpenService(
hSCManager,
ServiceName.c_str(),
SERVICE_ALL_ACCESS)) == NULL)
{
return;
}

DeleteService(hService);

CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
}
//---------------------------------------------------------------------------

void iS_StartDriver(AnsiString ServiceName)
{
SC_HANDLE hSCManager, hService;

if((hSCManager = OpenSCManager(
NULL,
NULL,
SC_MANAGER_ALL_ACCESS)) == NULL)
{
return;
}

if((hService=OpenService(
hSCManager,
ServiceName.c_str(),
SERVICE_ALL_ACCESS)) == NULL)
{
return;
}

StartService(hService,0,NULL);

CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
}
//---------------------------------------------------------------------------

void iS_StopDriver(AnsiString ServiceName)
{
SC_HANDLE hSCManager, hService;

if((hSCManager = OpenSCManager(
NULL,
NULL,
SC_MANAGER_ALL_ACCESS)) == NULL)
{
return;
}

if((hService=OpenService(
hSCManager,
ServiceName.c_str(),
SERVICE_ALL_ACCESS)) == NULL)
{
return;
}

SERVICE_STATUS SS;
ControlService(hService,SERVICE_CONTROL_STOP,&SS);

CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
}
//---------------------------------------------------------------------------

void iS_SetDriverParameter(AnsiString ServiceName,AnsiString Key,AnsiString Value)
{
TRegistry* RegGuard = new TRegistry;
try
{
RegGuard->RootKey = HKEY_LOCAL_MACHINE; // Section of registry to look for
if(!RegGuard->OpenKey("\\SYSTEM\\CurrentControlSet\\Services\\"+ServiceName+"\\Parameters",true))
{
;
}
else
{
RegGuard->WriteString(Key,Value);
RegGuard->CloseKey();
}
}
__finally
{
delete RegGuard;
}
}
//---------------------------------------------------------------------------

void iS_InstallDriver_9x(AnsiString ServiceName,AnsiString ServicePath )
{
//Create Subkey HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VxD\Product
//
AnsiString SubKey="\\SYSTEM\\CurrentControlSet\\Services\\VxD\\"+ServiceName;
TRegistry* Reg = new TRegistry;
try
{
Reg->RootKey = HKEY_LOCAL_MACHINE; // Section of registry to look for
if (!Reg->OpenKey(SubKey,true) )
;//ShowMessage("Error Opening/Creating key");
else
{
//Set Data: Start REG_BINARY:00,StaticVxD REG_SZ:Product.vxd
//
char BinZero=0;
Reg->WriteString("StaticVxD",ServicePath);
Reg->WriteBinaryData("Start",&BinZero,1);

Reg->CloseKey();
}
}
__finally
{
delete Reg;
}
}
//---------------------------------------------------------------------------

void iS_RemoveDriver_9x(AnsiString ServiceName)
{
//Create Subkey HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VxD\Product
//
AnsiString SubKey="\\SYSTEM\\CurrentControlSet\\Services\\VxD\\"+ServiceName;
TRegistry* Reg = new TRegistry;
try
{
Reg->RootKey = HKEY_LOCAL_MACHINE; // Section of registry to look for
if (!Reg->OpenKey(SubKey,true) )
;//ShowMessage("Error Opening/Creating key");
else
{
Reg->DeleteKey(SubKey);
Reg->CloseKey();
}
}
__finally
{
delete Reg;
}
}
//---------------------------------------------------------------------------

void iS_SetDriverParameter_9x(AnsiString ServiceName,AnsiString Key,AnsiString Value)
{
TRegistry* RegGuard = new TRegistry;
try
{
RegGuard->RootKey = HKEY_LOCAL_MACHINE; // Section of registry to look for
if(!RegGuard->OpenKey("\\SYSTEM\\CurrentControlSet\\Services\\VxD"+ServiceName+"\\Parameters",true))
{
;
}
else
{
RegGuard->WriteString(Key,Value);
RegGuard->CloseKey();
}
}
__finally
{
delete RegGuard;
}
}
//
warton 2003-11-28
  • 打赏
  • 举报
回复
void iS_SetGuardParameter_9x(AnsiString ServiceName,AnsiString Key,AnsiString Value)
{
}
//---------------------------------------------------------------------------

void iS_InstallGuard_9x(AnsiString ServiceName,AnsiString ServicePath )
{
//HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run
//
AnsiString SubKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunServices";
TRegistry* Reg = new TRegistry;
try
{
Reg->RootKey = HKEY_LOCAL_MACHINE; // Section of registry to look for
if (!Reg->OpenKey(SubKey,false) )
;//ShowMessage("Error Opening/Creating key");
else
{
Reg->WriteString(ServiceName,ServicePath);

Reg->CloseKey();
}
}
__finally
{
delete Reg;
}
}
//---------------------------------------------------------------------------

void iS_RemoveGuard_9x(AnsiString ServiceName)
{
//HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run
//
AnsiString SubKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunServices";
TRegistry* Reg = new TRegistry;
try
{
Reg->RootKey = HKEY_LOCAL_MACHINE; // Section of registry to look for
if (!Reg->OpenKey(SubKey,false) )
;//ShowMessage("Error Opening/Creating key");
else
{
Reg->DeleteValue(ServiceName);

Reg->CloseKey();
}
}
__finally
{
delete Reg;
}
}
//---------------------------------------------------------------------------

void iS_StartGuard_9x(AnsiString ServiceName)
{
//HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run
//
AnsiString SubKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunServices";
TRegistry* Reg = new TRegistry;
try
{
Reg->RootKey = HKEY_LOCAL_MACHINE; // Section of registry to look for
if (!Reg->OpenKey(SubKey,false) )
;//ShowMessage("Error Opening/Creating key");
else
{
AnsiString SrvPath=Reg->ReadString(ServiceName);
ShellExecute(NULL,"open",SrvPath.c_str(), NULL, NULL, SW_SHOWNORMAL);
Reg->CloseKey();
}
}
__finally
{
delete Reg;
}
}
//---------------------------------------------------------------------------

AnsiString iS_GetGuardDir_9x(AnsiString ServiceName)
{
//HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run
//
AnsiString SubKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunServices";
TRegistry* Reg = new TRegistry;
try
{
Reg->RootKey = HKEY_LOCAL_MACHINE; // Section of registry to look for
if (!Reg->OpenKey(SubKey,false) )
;//ShowMessage("Error Opening/Creating key");
else
{
AnsiString SrvPath=Reg->ReadString(ServiceName);
Reg->CloseKey();
delete Reg;Reg=NULL;
return ExtractFilePath(SrvPath);
}
}
catch(...)
{
if(Reg){delete Reg;Reg=NULL;}
return NULL;
}
return NULL;
}
//---------------------------------------------------------------------------

void iS_StopGuard_9x(AnsiString FormClassName)
{
HWND GuardHandle=::FindWindow(FormClassName.c_str(),NULL);
::SendMessage(GuardHandle,WM_CLOSE,0,0);
/*
::PostMessage(GuardHandle,WM_CLOSE,0,0);
Sleep(500);
*/
}
//---------------------------------------------------------------------------

bool iS_SystemVersion()
{
return (GetVersion()>0x80000000);
}
//---------------------------------------------------------------------------

const static char RegKey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
AnsiString GetPositionPath(ShortCutPosionType pos, ShortCutUserType user)
{
char chDir[512];
DWORD dwSize = sizeof(chDir);
long result;
HKEY hKey;
DWORD dwType;
if (user == ALL_USER)
result=RegOpenKeyEx(HKEY_LOCAL_MACHINE,RegKey,NULL,KEY_QUERY_VALUE,&hKey);
else if (user == CUR_USER)
result=RegOpenKeyEx(HKEY_CURRENT_USER,RegKey,NULL,KEY_QUERY_VALUE,&hKey);
if(result!=ERROR_SUCCESS)
return "";
AnsiString str;
if (user == ALL_USER)
str = "common ";
switch (pos) {
case POS_DESKTOP:
str += "Desktop";
break;
case POS_START_MENU:
str += "Start Menu";
break;
case POS_PROG_MENU:
str += "Programs";
break;
};
result=RegQueryValueEx(hKey,str.c_str(),0,&dwType,(LPBYTE)chDir,&dwSize);
if(result!=ERROR_SUCCESS)
return "";
RegCloseKey(hKey);
return AnsiString(chDir) + '\\';
}
void iS_CreateGroup(
AnsiString groupName,
ShortCutPosionType pos,
ShortCutUserType user
)
{
AnsiString path = GetPositionPath(pos, user);
if (path.Length() == 0)
return;
path += groupName;
::CreateDirectory(path.c_str(), 0);
}

void iS_RemoveGroup(
AnsiString groupName,
ShortCutPosionType pos,
ShortCutUserType user
)
{
AnsiString path = GetPositionPath(pos, user);
if (path.Length() == 0)
return;
path += groupName;
::RemoveDirectory(path.c_str());
}

void iS_CreateShortcut(
AnsiString groupName,
AnsiString shortcutName,
AnsiString destExe,
AnsiString hint,
ShortCutPosionType pos,
ShortCutUserType user
)
{
AnsiString path = GetPositionPath(pos, user);
if (path.Length() == 0)
return;
path += groupName;
path += '\\';
path += shortcutName;
path += ".lnk";
HRESULT hres;
IShellLink* pShellLink;
::CoInitialize(NULL);
hres=::CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,
IID_IShellLink,(LPVOID*)&pShellLink);
if(SUCCEEDED(hres))
{
IPersistFile* pPf;
pShellLink->SetPath(destExe.c_str());
pShellLink->SetDescription(hint.c_str());
hres=pShellLink->QueryInterface(IID_IPersistFile,(LPVOID*)&pPf);
if(SUCCEEDED(hres))
{
wchar_t sz[MAX_PATH];
::MultiByteToWideChar(CP_ACP,0,path.c_str(),-1,sz,MAX_PATH);
pPf->Save(sz,TRUE);
pPf->Release();
}
pShellLink->Release();
}
::CoUninitialize();
}

void iS_RemoveShortcut(
AnsiString groupName,
AnsiString shortcutName,
ShortCutPosionType pos,
ShortCutUserType user
)
{
AnsiString path = GetPositionPath(pos, user);
if (path.Length() == 0)
return;
path += groupName;
path += '\\';
path += shortcutName;
path += ".lnk";
SHFILEOPSTRUCT fileOp;
ZeroMemory( &fileOp, sizeof( fileOp)) ;
fileOp.hwnd=NULL;
fileOp.wFunc=FO_DELETE;
fileOp.pFrom=path.c_str();
fileOp.fFlags=FOF_NOCONFIRMATION | FOF_SILENT;
::SHFileOperation(&fileOp);
}
warton 2003-11-28
  • 打赏
  • 举报
回复
要定制安装程序还有很多问题的。
比如装卸载程序加到控制面版,驱动的卸载,服务的卸载等等。
加载更多回复(50)

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧