📄 yabinst.c
字号:
sprintf(logs,"--Deleting '%s'\n",PathLink);
logit(logs);
return DeleteFile(PathLink);
}
int MyLinks(int mode) /* add or remove shell links */
{
int success=TRUE;
LINKINFO *li; /* contains info about links */
char string[SSLEN];
LPITEMIDLIST pidl; /* path id */
char PathLink[MAX_PATH]; /* path name */
int res;
enumlinks(RESET);
if (mode==INSTALL) {
/* make filename from registry folder constant */
SHGetSpecialFolderLocation(NULL,CSIDL_PROGRAMS,&pidl);
SHGetPathFromIDList(pidl,PathLink);
strcat(PathLink,"\\"BASIC_NAME);
res=CreateDirectory(PathLink,NULL);
}
while(li=enumlinks(NEXT)) {
if (mode==INSTALL && !li->removeonly) {
sprintf(string,"Adding %s",li->desc);
progress(string);
success=SUCCEEDED(CreateShellLink(li,installpath)) && success;
}
else {
sprintf(string,"removing %s",li->desc);
progress(string);
success=SUCCEEDED(DeleteShellLink(li)) && success;
}
}
if (mode!=INSTALL) {
/* make filename from registry folder constant */
SHGetSpecialFolderLocation(NULL,CSIDL_PROGRAMS,&pidl);
SHGetPathFromIDList(pidl,PathLink);
strcat(PathLink,"\\"BASIC_NAME);
res=RemoveDirectory(PathLink);
}
return success;
}
int MyFiles(int mode) /* copy or delete files */
{
int success=TRUE;
char *name;
int failures=0;
char string[SSLEN]; /* multi-purpose-string */
switch(mode) {
case INSTALL:
enumfiles(RESET);
while(success && (name=enumfiles(NEXT))) {
sprintf(string,"%s%s",currentpath,name);
success=Copy(string,app(name),here) && success;
sprintf(string,"Copying '%s'",name);
progress(string);
}
break;
case REMOVE:
enumfiles(RESET);
while(name=enumfiles(NEXT)) {
if (!DeleteFile(app(name))) failures++;
sprintf(string,"Deleting '%s'",name);
progress(string);
}
if (failures>1) success=FALSE;
break;
default:
break;
}
return success;
}
int MyRegs(int mode) /* add or delete entries to or from registry */
{
int success=TRUE;
char string[SSLEN]; /* multi-purpose-string */
char windir[SSLEN]; /* windows-directory */
switch(mode) {
case INSTALL:
/* registering uninstall program */
progress("Registering uninstall-program");
success=putreg(LOCAL,UNINSTALL BASIC_NAME,"DisplayName",BASIC_NAME);
sprintf(string,"%s%s %s",installpath,BASIC_SETUP,"remove");
success=putreg(LOCAL,UNINSTALL BASIC_NAME,"UninstallString",string) && success;
progress(NULL);
progress("Adding defaults to registry.");
/* make changes in registry, put in defaults */
success=putreg(LOCAL,SOFT BASIC_NAME,"path",installpath) && success;
progress(NULL);
success=putreg(LOCAL,SOFT BASIC_NAME,"font",DEFAULTFONT) && success;
progress(NULL);
success=putreg(LOCAL,SOFT BASIC_NAME,"geometry",DEFAULTGEOMETRY) && success;
sprintf(string,"%5.2f",newversion);
progress(NULL);
success=putreg(LOCAL,SOFT BASIC_NAME,"version",string) && success;
progress("Registering file extension.");
/* change context-menue */
success=putreg(ROOT,BASIC_EXTENSION,"",BASIC_NAME) && success;
progress(NULL);
success=putreg(ROOT,BASIC_NAME,"","Yabasic Program") && success;
progress(NULL);
success=putreg(ROOT,BASIC_NAME"\\DefaultIcon","",app(BASIC_ICON)) && success;
progress(NULL);
success=putreg(ROOT,BASIC_EXTENSION"\\ShellNew","NullFile","") && success;
success=putreg(ROOT,BASIC_NAME"\\shell\\open","","&Execute") && success;
success=putreg(ROOT,BASIC_NAME"\\shell\\open\\command","",
app(BASIC_EXE" \"%1\"")) && success;
progress("Linking to root-Menu");
success=putreg(ROOT,BASIC_NAME"\\shell\\New","","&Edit") && success;
GetWindowsDirectory(string,SSLEN);
sprintf(windir,"%s%s",brushup(string),"Notepad.exe \"%1\"");
success=putreg(ROOT,BASIC_NAME"\\shell\\New\\command","",windir)
&& success;
return success;
case REMOVE:
delreg(ROOT,BASIC_EXTENSION,"");
progress(NULL);
delreg(ROOT,BASIC_NAME,"");
progress(NULL);
delreg(LOCAL,SOFT BASIC_NAME,"");
progress(NULL);
delreg(LOCAL,UNINSTALL BASIC_NAME,"");
}
return success;
}
BOOL CALLBACK progressdialog(HWND handle,UINT message,
WPARAM wparam,LPARAM lparam)
/* callback for cprogress dialog */
{
switch(message) {
case WM_INITDIALOG:
{ /* center dialog box */
RECT rc;
GetWindowRect(handle,&rc);
SetWindowPos(handle,HWND_TOP,
((GetSystemMetrics(SM_CXSCREEN)-(rc.right-rc.left))/2),
((GetSystemMetrics(SM_CYSCREEN)-(rc.bottom-rc.top))/2),
0,0,SWP_NOSIZE|SWP_NOACTIVATE|SWP_SHOWWINDOW);
}
return TRUE;
default:
break;
}
return FALSE;
}
void progress(char *msg) /* show progress */
{
int timerid;
MSG timermsg;
RECT rc;
static int count=0;
static HWND progressbox=NULL; /* handle of progress dialog */
static HWND hwndPB=NULL; /* handle of progress bar */
char string[SSLEN]; /* multi-purpose string */
int thumb; // height of scroll bar arrow
count++;
/* create progress dialog */
if (progressbox==NULL) {
InitCommonControls();
progressbox=CreateDialog((HANDLE)this_instance,
MAKEINTRESOURCE(IDD_PROGRESSDIALOG),
(HANDLE)NULL,
(DLGPROC)progressdialog);
GetClientRect(progressbox,&rc);
thumb=GetSystemMetrics(SM_CYVSCROLL);
hwndPB=CreateWindowEx(0,PROGRESS_CLASS,(LPSTR)NULL,
WS_CHILD|WS_VISIBLE, rc.left+thumb,
rc.bottom- 3*thumb, rc.right-2*thumb, 2*thumb,
progressbox, (HMENU) 0, this_instance, NULL);
SendMessage(hwndPB, PBM_SETRANGE, 0, MAKELPARAM(0,total_progress));
SendMessage(hwndPB, PBM_SETSTEP, (WPARAM) 1, 0);
/* actually display the window */
ShowWindow(progressbox,SW_SHOW);
}
/* change text */
if (msg) SetDlgItemText(progressbox,IDC_PROGRESSTEXT,msg);
/* advance progress count */
SendMessage(hwndPB, PBM_STEPIT, 0, 0);
/* write to logfile */
if (msg) {
sprintf(logs,"--Progress: '%s'\n",msg);
logit(logs);
}
/* set heading of progress window */
sprintf(string,"Work in progress ... step %d",count);
SendMessage((HWND)progressbox,(UINT)WM_SETTEXT,0,(LPARAM)(LPCTSTR)string);
/* wait a bit ... */
timerid=SetTimer(NULL,0,200,(TIMERPROC) NULL);
GetMessage((LPMSG)&timermsg,NULL,WM_TIMER,WM_TIMER);
KillTimer(NULL,timerid);
}
int Copy(char *name,char *dest,int here) /* copy files */
{
int ret;
char string[SSLEN];
WIN32_FIND_DATA file;
if (here) {
ret=(FindFirstFile(dest,&file)!=INVALID_HANDLE_VALUE);}
else
ret=CopyFile(name,dest,FALSE);
if (!ret) {
sprintf(string,"Failed to copy '%s' !",name);
MyMessage(NULL,string,INSTALL_HEADING,MB_OK|MB_SYSTEMMODAL|MB_ICONINFORMATION);
}
return ret;
}
char *enumfiles(int mode) /* give filenames, one after another */
{
static int num=0;
if (mode==RESET) {
num=0;
return NULL;
}
num++;
if (num==1) return strdup(BASIC_EXE);
if (num==2) return strdup(BASIC_ICON);
if (num==3) return strdup(BASIC_SETUP);
if (num==4) return strdup(BASIC_DEMO".yab");
if (num==5) return strdup(BASIC_README);
if (num==6) return strdup(BASIC_LICENSE);
if (num==7) return strdup(BASIC_NAME".htm");
if (num==8) return strdup(BASIC_NAME".txt");
return NULL;
}
LINKINFO *enumlinks(int mode) /* give back linkinfos, one after another */
{
static int num=0;
static LINKINFO li[]={
{CSIDL_PROGRAMS,BASIC_NAME"\\"BASIC_NAME".LNK",BASIC_EXE,
"Link to "BASIC_NAME,BASIC_ICON,FALSE},
{CSIDL_PROGRAMS,BASIC_NAME".LNK",BASIC_EXE,
"Link to "BASIC_NAME,BASIC_ICON,TRUE},
{CSIDL_PROGRAMS,BASIC_NAME"\\DEMO.LNK",BASIC_DEMO".yab",
"Link to "BASIC_DEMO".yab","\025",FALSE},
{CSIDL_DESKTOPDIRECTORY,"DEMO.LNK",BASIC_DEMO".yab",
"Link to "BASIC_DEMO".yab",BASIC_ICON,FALSE},
{CSIDL_PROGRAMS,BASIC_NAME"\\DOCU.LNK",BASIC_NAME".htm",
"Link to "BASIC_NAME".htm","\026",FALSE},
{CSIDL_DESKTOPDIRECTORY,"DOCU.LNK",BASIC_NAME".htm",
"Link to "BASIC_NAME".htm",BASIC_ICON,FALSE}
};
if (mode==RESET) {
num=-1;
return NULL;
}
num++;
if (num>5)
return NULL;
else
return &li[num];
}
char *brushup(char *path) /* change to upper case, add slash */
{
int i;
char buf[SSLEN];
if (path==NULL) return NULL;
i=0;
do {
buf[i]=tolower(path[i]);
if (buf[i]=='/') buf[i]='\\';
i++;
}while(path[i]!='\0' && isprint(path[i]));
buf[i]='\0';
if (buf[i-1]!='\\') {
buf[i]='\\';
buf[i+1]='\0';
}
return strdup(buf);
}
void logit(char *text)
/*
write text to log-file
text : text to write
*/
{
static FILE *log=NULL; /* file for logging */
SYSTEMTIME time; /* time */
char string[SSLEN];
static int oldtime;
/* open log-file */
if (!log) {
sprintf(string,"%s%s",temppath,BASIC_LOG);
log=fopen(string,"a");
GetSystemTime(&time);
if (log) {
fprintf(log,"\n\n\n---------------------------------------------------\n"
"Starting installation-log, "
"hr=%d, min=%d, sec=%d, msec=%d.\n",
time.wHour,time.wMinute,time.wSecond,time.wMilliseconds);
oldtime=GetCurrentTime();
}
}
if (log) {
GetSystemTime(&time);
if (GetCurrentTime()-oldtime>10000) {
fprintf(log,"Timestamp: hr=%d, min=%d, sec=%d, msec=%d\n",
time.wHour,time.wMinute,time.wSecond,time.wMilliseconds);
oldtime=GetCurrentTime();
}
if (text) {
if (strncmp(text,"--",2)) fprintf(log," ");
while(*text!='\0') {
fputc(*text,log);
if (*text=='\n' && *(text+1)!='\0') fprintf(log," ");
text++;
}
}
else { /* not text ... */
fprintf(log,"Closing installation-log.");
fflush(log);
fclose(log);
}
}
if (log) fflush(log);
}
int MyMessage(HWND handle,LPCSTR text,LPCSTR title,UINT style)
/* wrapper for MessageBox() */
{
sprintf(logs,"--Message box: '%s'\n",text);
logit(logs);
return MessageBoxEx(handle,text,title,style,
MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -