📄 unit1.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <shlobj.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool cancel=false; //用于终止安装
bool ok=false;
unsigned int allfilesize=0; //被安装文件的总的大小
char setuppath[MAX_PATH]; //安装路径
HWND myexe; //资源句柄
char buf[MAX_PATH];
char buf1[MAX_PATH];
//---------------------------------------------------------------------------
BOOL CALLBACK MyHideWinzip(HWND hwnd ,unsigned int p)
{ //枚举窗口的回调函数,用于隐藏WinZip Self-Extractor
//回调直至本函数返回false,或全部窗口被枚举
char* buf=new char[200];
GetWindowText(hwnd,buf,200);
if(strstr(buf,"WinZip Self-Extractor - "))
{ShowWindow(hwnd,SW_HIDE);
return(false);
}
delete[] buf;
return(true);
}
//----------------------------------------------------------------------------
void MyWriteFile(int i,char* path)
{ //用于把i号资源写入安装目录path中
HWND fileres,file,ff;
unsigned long aa;
int ressize;
LoadString(myexe,i,buf,MAX_PATH); //从资源文件中装入文件名
lstrcpy(buf1,"f");
lstrcat(buf1,IntToStr(i).c_str());
fileres=FindResource(myexe,buf1,"MYRES");
ressize=SizeofResource(myexe,fileres);
lstrcpy(buf1,path);
lstrcat(buf1,buf);
file=LoadResource(myexe,fileres); //装入与文件名对应的资源
ff=CreateFile(buf1,GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
Form1->StatusBar1->SimpleText="正在复制文件:"+AnsiString(buf1);
Form1->Memo1->Lines->Add("正在复制文件:"+AnsiString(buf1));
WriteFile(ff,file,ressize,&aa,NULL);
CloseHandle(ff);
float temp;
temp=(float)ressize/(float)allfilesize*100;
Form1->ProgressBar1->Position=Form1->ProgressBar1->Position+int(temp+0.5);
}
//---------------------------------------------------------------------------
DWORD WINAPI MyThreid(LPVOID xx)
{ //复制文件线程,xx传入指向安装路径的指针,必须xx指向的变量在本线程生存期内存在
//比如:在一个按钮的OnClick事件中生成该线程,如果xx指向的是在此事件中定义的非静态
//变量,则会出错,因为该线程运行期间,OnClick的代码已经结束,xx指向的变量已被删除。
char num[5];
char buf2[MAX_PATH];
num[0]=NULL;
LoadString(myexe,5000,num,sizeof(num));
if(num[0]&& !cancel)
{//有num个要创始的安装目录
strcpy(buf1,(char*)xx);
CreateDirectory(buf1,NULL);
for (int i=5001;i<=5000+StrToInt(AnsiString(num));i++)
{ //目录名的资源ID从5000开始
LoadString(myexe,i,buf,MAX_PATH);
lstrcpy(buf1,(char*)xx);
lstrcat(buf1,buf);
Form1->StatusBar1->SimpleText="正在创建目录:"+AnsiString(buf1);
Form1->Memo1->Lines->Add("正在创建目录:"+AnsiString(buf1));
CreateDirectory(buf1,NULL);
}
}
num[0]=NULL;
LoadString(myexe,0,num,sizeof(num));
if(num[0] && !cancel)
{ //有num个要复制到安装目录中的文件
for (int i=1;i<=StrToInt(AnsiString(num));i++)
{ //文件名的资源ID从1开始
if (cancel) break;
MyWriteFile(i,(char*)xx);
}
}
num[0]=NULL;
LoadString(myexe,6000,num,sizeof(num));
if(num[0] && !cancel)
{//有num个要复制到Windows目录中的文件
GetWindowsDirectory(buf2,MAX_PATH);
strcat(buf2,"\\");
for (int i=6001;i<=6000+StrToInt(AnsiString(num));i++)
{//文件名的资源ID从6000开始
if (cancel) break;
MyWriteFile(i,buf2);
}
}
num[0]=NULL;
LoadString(myexe,7000,num,sizeof(num));
if(num[0]&& !cancel)
{//有num个要创始的快捷方式
//有*号的语句是创始快捷方式的套话
HRESULT hres; //*
IShellLink *psl; //*
IPersistFile *ppf; //*
wchar_t wsz[MAX_PATH];//*
CoInitialize(NULL); //*
hres=CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&psl); //*
if(FAILED(hres)) ShowMessage("不能建立快捷方式");
GetWindowsDirectory(buf1,MAX_PATH);
lstrcat(buf1,"\\Start Menu\\Programs\\");
LoadString(myexe,10001,buf,MAX_PATH);
lstrcat(buf1,buf);
Form1->Memo1->Lines->Add("正在创建目录:"+AnsiString(buf1));
CreateDirectory(buf1,NULL);
for (int i=7001;i<=7000+StrToInt(AnsiString(num))*2;i+=2)
{ //快捷方式的资源ID从7001开始
if (cancel) break;
LoadString(myexe,i,buf1,MAX_PATH); //i 获取要创建快捷方式的文件名
lstrcpy(buf,setuppath);
lstrcat(buf,buf1);
psl->SetPath(buf); //*
GetWindowsDirectory(buf1,MAX_PATH);
lstrcat(buf1,"\\Start Menu\\Programs\\");
LoadString(myexe,10001,buf,MAX_PATH);
lstrcat(buf1,buf);
lstrcat(buf1,"\\");
LoadString(myexe,i+1,buf,MAX_PATH); //i+1 获取快捷方式的名称
lstrcat(buf1,buf);
lstrcat(buf1,".LNK"); //*
Form1->StatusBar1->SimpleText="正在创建快捷方式:"+AnsiString(buf1);
Form1->Memo1->Lines->Add("正在创建快捷方式:"+AnsiString(buf1));
hres=psl->QueryInterface(IID_IPersistFile,(void**)&ppf); //*
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,buf1, -1, wsz,MAX_PATH); //*
hres=ppf->Save(wsz,STGM_READWRITE); //*
}
ppf->Release(); //*
psl->Release(); //*
CoUninitialize(); //*
}
if(!cancel)
{ok=!ok;
cancel=!cancel;
Form1->StatusBar1->SimpleText="安装成功!";
Form1->Memo1->Lines->Add("安装成功!");
Form1->Button2->Enabled=false;
}
else
{Form1->StatusBar1->SimpleText="安装被用户终止!";
Form1->Memo1->Lines->Add("安装被用户终止!");
}
ExitThread(0);
return(true);
}
//---------------------------------------------------------------------------
unsigned int MySize(void) //从资源文件中获取安装文件的总大小
{
unsigned int setupsize=0;
char num[5];
char *p;
char *buf1=new char[MAX_PATH];
p=buf1;
num[0]=NULL;
LoadString(myexe,0,num,MAX_PATH);
if(num[0])
for (int i=1;i<=StrToInt(AnsiString(num));i++)
{
lstrcpy(p,"f");
lstrcat(p,IntToStr(i).c_str());
setupsize+=SizeofResource(myexe,FindResource(myexe,p,"MYRES"));
}
num[0]=NULL;
LoadString(myexe,6000,num,MAX_PATH);
if(num[0])
for (int i=6001;i<=6001+StrToInt(AnsiString(num));i++)
{
lstrcpy(p,"f");
lstrcat(p,IntToStr(i).c_str());
setupsize+=SizeofResource(myexe,FindResource(myexe,p,"MYRES"));
}
delete[] buf1;
return (setupsize);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
char *buf=new char[20];
EnumWindows((WNDENUMPROC)MyHideWinzip,0); //如果使用了WinZip Self-Extractor则隐藏之
allfilesize=MySize(); //获得被安装文件的总字节数
Label1->Caption=allfilesize;
Label1->Caption=Label1->Caption+" 字节";
Label2->Caption=FreeDiskSpace('c'); //获取c盘的自由空间字节数
Label2->Caption=Label2->Caption+" 字节";
Edit1->Text="c:\\program files\\";
myexe=GetModuleHandle(NULL); //获取资源句柄
LoadString(myexe,10000,buf,20); //获取安装目录
Edit1->Text=Edit1->Text+AnsiString(buf);
Button2->Enabled=false;
delete[] buf;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
cancel=false;
DWORD threid;
lstrcpy(setuppath,Edit1->Text.c_str());
if(setuppath[lstrlen(setuppath)-1]!='\\') lstrcat(setuppath,"\\");
CreateThread(NULL,0,MyThreid, (LPVOID)setuppath,0,&threid); //生成线程,开始复制文件。
Form1->Button2->Enabled=true;
Form1->Button1->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form1->Button1->Enabled=true;
Form1->Button2->Enabled=false;
cancel=true; //设置中止标志
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Form2->ShowModal();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if(!ok) ShowMessage("!! 安装没有完成\n请重新运行安装程序");
Form1->Close();
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -