⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yabinst.c

📁 一个小巧的BASIC解释器的源代码很小可它的确做到了
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -