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

📄 yabinst.c

📁 一个小巧的BASIC解释器的源代码很小可它的确做到了
💻 C
📖 第 1 页 / 共 3 页
字号:
			  sscanf(commandline,"copied %d",&pid);
			  from=OpenProcess(PROCESS_QUERY_INFORMATION | SYNCHRONIZE,FALSE,pid);
			  if (from && WaitForSingleObject(from,10000)==WAIT_TIMEOUT) {
				  MyMessage(NULL,"Couldn't take over",REMOVE_HEADING,MB_STYLE);
				  end(REMOVE_FAILURE);
			  }
			  
			  DeleteFile(app(BASIC_SETUP));     
			  success=RemoveDirectory(installpath);
			  if (!success) {
				  char file[SSLEN];
				  WIN32_FIND_DATA found;
				  HANDLE search;
				  
				  sprintf(file,"%s\\*.*",installpath);
				  search=FindFirstFile(file,&found);
				  FindNextFile(search,&found);
				  if (!FindNextFile(search,&found)) {
					  sprintf(string,"Could not remove directory '%s' !",installpath);
					  MyMessage(NULL,string,REMOVE_HEADING,MB_STYLE);
					  end(REMOVE_FAILURE);}
				  else {
					  int i;
					  int n;
					  char msg[1000];
					  
					  sprintf(msg,"Could not remove directory '%s'.\n"
						  "These files of suspect origin have been found:\n    %s\n%n"
						  ,installpath,found.cFileName,&n);
					  i=n;
					  while(FindNextFile(search,&found)) {
						  sprintf(msg+i,"    %s\n%n",found.cFileName,&n);
						  i+=n;
					  }
					  sprintf(msg+i,"You may remove these files by hand and retry !\n");
					  MyMessage(NULL,msg,REMOVE_HEADING,MB_STYLE);
					  end(REMOVE_FAILURE);}
			  }
		  }
		  
		  /* delete shell links */
		  MyLinks(REMOVE);
		  
		  /* remove entries from the registry */
		  MyRegs(REMOVE);
		  
		  end(REMOVE_SUCCESS);
  } 
  return TRUE;
}


/*------------ subroutines --------------*/

BOOL CALLBACK pathdialog(HWND handle,UINT message,
						 WPARAM wparam,LPARAM lparam)
						 /* callback for choice of installation path */
{
	int cmdid;           /* id of command */
	char buf[SSLEN];       /* buffer for installation-path */
	int offset=0;
	char name[SSLEN];       /* buffer for filename */
	OPENFILENAME fname; /* for common dialog */
	int ret;

	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);
		}
		SetDlgItemText(handle,IDINSTPATH,installpath);
		return TRUE;
		
	case WM_COMMAND:
		cmdid=LOWORD(wparam);
		switch(cmdid) {
		case IDOK:
			logit("--Pathdialog: OK\n");
			EndDialog(handle,TRUE);
			GetDlgItemText(handle,IDINSTPATH,buf,SSLEN);
			installpath=strdup(buf);
			return TRUE;
		case IDCANCEL:
			logit("--Pathdialog: CANCEL\n");
			EndDialog(handle,FALSE);
			return TRUE;
		case IDC_BROWSE:
			fname.lStructSize=sizeof(fname);
			fname.hwndOwner=handle;
			fname.hInstance=this_instance;
			fname.lpstrFilter="None\0+.+++\0\0";
			fname.lpstrCustomFilter=NULL; 
			fname.nMaxCustFilter=0;    
			fname.nFilterIndex=0; 
			fname.nMaxFile=SSLEN;
			fname.lpstrFileTitle=NULL;
			fname.nMaxFileTitle=0;
			offset=0;
			GetDlgItemText(handle,IDINSTPATH,buf,SSLEN);
			ret=GetFileAttributes(buf);
			if (ret==0xFFFFFFFF || !(ret & FILE_ATTRIBUTE_DIRECTORY)) {
				GetLogicalDriveStrings(SSLEN,buf);
				offset=strlen(buf)+1;
			}
			fname.lpstrInitialDir=buf+offset;
			strcpy(name,"dummy");
			fname.lpstrFile=name;
			fname.lpstrTitle="Select yabasic's directory"; 
			fname.Flags=OFN_HIDEREADONLY | OFN_EXPLORER | 
				OFN_ENABLEHOOK | OFN_ENABLETEMPLATE | OFN_NOVALIDATE;
			fname.lpstrDefExt=NULL; 
			fname.lCustData=0;
			fname.lpfnHook=HookProc; 
			fname.lpTemplateName=MAKEINTRESOURCE(IDD_EXPLANATION);
			if (GetOpenFileName(&fname)) {
				name[fname.nFileOffset]='\0';
				SetDlgItemText(handle,IDINSTPATH,name);
			}
			return TRUE;
		default:
			break;
		}
		default:
			break;
	}
	return FALSE;
}


UINT CALLBACK HookProc(HWND hdl,UINT msg,WPARAM wparam,LPARAM lparam) /* hook for save as */
{
	if (msg==WM_INITDIALOG) {
		RECT rc;
		/* center dialog box */
		GetWindowRect(GetParent(hdl),&rc);
		SetWindowPos(GetParent(hdl),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);
		CommDlg_OpenSave_HideControl(GetParent(hdl),cmb1);
		CommDlg_OpenSave_HideControl(GetParent(hdl),edt1);
		CommDlg_OpenSave_SetControlText(GetParent(hdl),IDOK,"Okay");
		CommDlg_OpenSave_SetControlText(GetParent(hdl),IDCANCEL,"Cancel");
		CommDlg_OpenSave_SetControlText(GetParent(hdl),stc4,"Install in: ");
		CommDlg_OpenSave_HideControl(GetParent(hdl),stc3);
		CommDlg_OpenSave_HideControl(GetParent(hdl),stc2);
		return FALSE;
	}		
	return FALSE;
}


int delreg(HKEY start,char *keyname,char *subkey) 
/* 
delete keys from Registry
start   : one of the predefined key (e.g. HKEY_CLASSES_ROOT)
keyname : path to the key to delete
subkey  : subkey to delete 
*/
{
	HKEY key;
	
	if (RegOpenKeyEx(start,keyname,0,KEY_ALL_ACCESS,&key)!=ERROR_SUCCESS) 
		return FALSE;
	
	if (RegDeleteKey(key,subkey)!=ERROR_SUCCESS) return FALSE;
	
	return TRUE;
}


char *getreg(char *name) /* get keys from Registry */
{
	char *keyname="SOFTWARE\\"BASIC_NAME;
	HKEY key;
	char value[SSLEN];
	DWORD n;
	
	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyname,0,
		KEY_ALL_ACCESS,&key)!=ERROR_SUCCESS) return NULL;
	n=SSLEN;
	value[0]='\0';
	if (RegQueryValueEx(key,name,NULL,
		      NULL,value,&n)!=ERROR_SUCCESS) return NULL;
	value[n]='\0';
	
	return strdup(value);
}


int putreg(HKEY start,char *keyname,char *name,char *content) 
/* 
put keys into Registry 
start   : one of the predefined key (e.g. HKEY_CLASSES_ROOT)
keyname : path to the key to create
name    : subkey to create
content : it's content
*/

{
	HKEY key;
	DWORD status;
	
	RegCreateKeyEx(start,keyname,0,"",
		0,KEY_ALL_ACCESS,NULL,&key,&status);
	if (RegSetValueEx(key,name,0,REG_SZ,
		content,strlen(content)+1)!=ERROR_SUCCESS) {
		return FALSE;
	}
	return TRUE;
}


void end(int m) { /* display message and terminate */
	char *msg;
	int ret;
	
	switch(m) {
	case INSTALL_CANCELLED:
		msg="Okay, installation cancelled.\n"
			"No garbage has been left.";
		ret=FALSE;
		break;
	case INSTALL_FAILURE:
		msg="Installation failed.\n"
			"Some garbage has been left in the system.\n"
			"To clear up, you better remove "BASIC_NAME".";
		ret=FALSE;
		break;
	case INSTALL_ABORTED:
		msg="Installation aborted.\n"
			"Some garbage has been left in the system !\n"
			"To clear up, you better remove "BASIC_NAME".";
		ret=FALSE;
		break;
	case INSTALL_SUCCESS:
		msg="Installation completed successfully !\n"
			"You may now start writing basic-programs.";
		ret=TRUE;
		break;
	case REMOVE_SUCCESS:
		msg=BASIC_NAME" has been removed properly !";
		ret=TRUE;
		break;
	case REMOVE_CANCELLED:
		msg="Cancelled. "BASIC_NAME" has been left intact.";
		ret=FALSE;
		break;
	case REMOVE_FAILURE:
		msg="Couldn't remove "BASIC_NAME" properly !";
		ret=FALSE;
		break;
	case SILENT:
		ret=TRUE;
		goto silent;
	default:
		break;
	}
	MyMessage(NULL,msg,INSTALL_HEADING,MB_STYLE);
	
silent:
	
	/* close log-file */
	logit(NULL); 
	exit(ret);
	
	return;
}


char *app(char *trail) /* append trail to installpath */
{
	char *result;
	int i,t;
	
	i=strlen(installpath);
	t=strlen(trail);
	
	result=malloc(i+t+1);
	memcpy(result,installpath,i);
	memcpy(result+i,trail,t);
	result[t+i]='\0';
	
	return result;
}


HRESULT CreateShellLink(LINKINFO *li,char *path)
/* 
stolen from win32 SDK Help: Create a shell-link 
li    : points to LINKINFO structure containing all infos about link 
path  : Full pathname for objects
*/
{ 
	HRESULT hres;                /* return value */
	IShellLink* psl;             /* pointer to new shell-link */
	LPITEMIDLIST pidl;           /* path id */
	char PathLink[MAX_PATH];     /* path name */
	char string[SSLEN];          /* multi-purpose string */
	static int first=TRUE;
	
	/* make filename from registry folder constant */
	hres=SHGetSpecialFolderLocation(NULL,li->folder,&pidl);
	if (!SUCCEEDED(hres)) return hres;
	SHGetPathFromIDList(pidl,PathLink);
	strcat(PathLink,"\\");
	strcat(PathLink,li->link);
	
	/* initialize COM-library */
	if (first) {
		CoInitialize(NULL);
		first=FALSE;
	}
	
	/* Get a pointer to the IShellLink interface. */
	hres=CoCreateInstance(&CLSID_ShellLink,NULL, 
		CLSCTX_INPROC_SERVER,&IID_IShellLink,&psl); 
	if (SUCCEEDED(hres)) { 
		IPersistFile* ppf; 
		
		/* Set the path to the shortcut target */
		sprintf(string,"%s%s",path,li->file);
		psl->lpVtbl->SetPath(psl,string); 
		
		/* add description */
		psl->lpVtbl->SetDescription(psl,li->desc); 
		
		/* set working directory */
		psl->lpVtbl->SetWorkingDirectory(psl,path);
		
		/* set icon */
		if (li->icon[1]) {
			sprintf(string,"%s%s",path,li->icon);
			psl->lpVtbl->SetIconLocation(psl,string,0);
		} else {
			GetSystemDirectory(string,SSLEN);
			strcat(string,"\\shell32.dll");
			psl->lpVtbl->SetIconLocation(psl,string,li->icon[0]);
		}
		
		/* Query IShellLink for the IPersistFile interface for saving the 
		shortcut in persistent storage. */
		hres=psl->lpVtbl->QueryInterface(psl,&IID_IPersistFile,&ppf); 
		
		if (SUCCEEDED(hres)) { 
			WORD wsz[MAX_PATH]; 
			
			/* Ensure that the string is ANSI. */
			MultiByteToWideChar(CP_ACP,0,PathLink,-1,wsz,MAX_PATH); 
			
			/* Save the link by calling IPersistFile::Save. */
			hres=ppf->lpVtbl->Save(ppf,wsz,TRUE);
			ppf->lpVtbl->Release(ppf); 
		} 
		psl->lpVtbl->Release(psl); 
	} 
	return hres; 
} 


HRESULT DeleteShellLink(LINKINFO *li)
/* 
Delete a shell-link 
li    : points to LINKINFO structure containing all infos about link 
*/
{ 
	HRESULT hres;                /* return value */
	LPITEMIDLIST pidl;           /* path id */
	char PathLink[MAX_PATH];     /* path name */
	
	/* make filename from folder constant */
	hres=SHGetSpecialFolderLocation(NULL,li->folder,&pidl);
	if (!SUCCEEDED(hres)) return hres;
	SHGetPathFromIDList(pidl,PathLink);
	strcat(PathLink,"\\");
	strcat(PathLink,li->link);
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -