📄 yabinst.c
字号:
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 + -