277 lines
7.1 KiB
C
277 lines
7.1 KiB
C
|
#include <windows.h>
|
||
|
#include "RegEdit.h"
|
||
|
|
||
|
#ifndef DBCS
|
||
|
#define AnsiNext(x) ((x)+1)
|
||
|
#endif
|
||
|
|
||
|
#define NUMACTIONS (ID_LASTACTIONRADIO-ID_FIRSTACTIONRADIO+1)
|
||
|
#define EDITSPERACTION (ID_LASTEDIT-ID_FIRSTACTIONEDIT+1)
|
||
|
#define OFFSET_COMMAND 0
|
||
|
#define OFFSET_FIRSTDDE 1
|
||
|
#define OFFSET_DDEEXEC 1
|
||
|
#define OFFSET_DDEIFEXEC 2
|
||
|
#define OFFSET_DDEAPP 3
|
||
|
#define OFFSET_DDETOPIC 4
|
||
|
#define BLOCKLEN 100
|
||
|
|
||
|
char szNull[] = "";
|
||
|
|
||
|
static char szShell[] = "shell";
|
||
|
static char szCommand[] = "command";
|
||
|
static char szDDEExec[] = "ddeexec";
|
||
|
static char szDDEIfExec[] = "ddeexec\\ifexec";
|
||
|
static char szDDEApplication[] = "ddeexec\\application";
|
||
|
static char szDDETopic[] = "ddeexec\\topic";
|
||
|
static char *ppCommands[] = {
|
||
|
szCommand, szDDEExec, szDDEIfExec, szDDEApplication, szDDETopic
|
||
|
} ;
|
||
|
static char szOpen[] = "open";
|
||
|
static char szPrint[] = "print";
|
||
|
static char *ppActionIds[] = {
|
||
|
szOpen, szPrint
|
||
|
} ;
|
||
|
static char szSystem[] = "System";
|
||
|
|
||
|
char cUsesDDE[NUMACTIONS];
|
||
|
|
||
|
HANDLE *pLocalVals = NULL;
|
||
|
|
||
|
WORD NEAR PASCAL CreateId(HANDLE hId)
|
||
|
{
|
||
|
HKEY hKeyNew;
|
||
|
PSTR pId, pTemp;
|
||
|
WORD wErrMsg = IDS_INVALIDID;
|
||
|
|
||
|
pId = LocalLock(hId);
|
||
|
if(!*pId || *pId=='.')
|
||
|
goto Error1;
|
||
|
for(pTemp=pId; *pTemp; ++pTemp)
|
||
|
/* this excludes '\\' and all other chars except 33-127 */
|
||
|
if(*pTemp=='\\' || *pTemp<=' ')
|
||
|
goto Error1;
|
||
|
|
||
|
wErrMsg = IDS_EXISTS;
|
||
|
if(RegOpenKey(HKEY_CLASSES_ROOT, pId, &hKeyNew) == ERROR_SUCCESS)
|
||
|
goto Error2;
|
||
|
|
||
|
if(wErrMsg=GetErrMsg((WORD)RegCreateKey(HKEY_CLASSES_ROOT, pId, &hKeyNew)))
|
||
|
goto Error1;
|
||
|
wErrMsg = NULL;
|
||
|
|
||
|
Error2:
|
||
|
RegCloseKey(hKeyNew);
|
||
|
Error1:
|
||
|
LocalUnlock(hId);
|
||
|
return(wErrMsg);
|
||
|
}
|
||
|
|
||
|
WORD NEAR PASCAL MyGetClassName(HANDLE hId, HANDLE *hName)
|
||
|
{
|
||
|
WORD wErrMsg;
|
||
|
|
||
|
wErrMsg = GetErrMsg((WORD)MyQueryValue(HKEY_CLASSES_ROOT, LocalLock(hId),
|
||
|
hName));
|
||
|
LocalUnlock(hId);
|
||
|
return(wErrMsg);
|
||
|
}
|
||
|
|
||
|
WORD NEAR PASCAL DeleteClassId(HANDLE hId)
|
||
|
{
|
||
|
WORD wErrMsg;
|
||
|
|
||
|
wErrMsg = GetErrMsg((WORD)RegDeleteKey(HKEY_CLASSES_ROOT, LocalLock(hId)));
|
||
|
LocalUnlock(hId);
|
||
|
return(wErrMsg);
|
||
|
}
|
||
|
|
||
|
WORD NEAR PASCAL MergeData(HWND hWndName, HANDLE hId)
|
||
|
{
|
||
|
HANDLE hName;
|
||
|
HANDLE *phTemp;
|
||
|
WORD wErrMsg = IDS_OUTOFMEMORY;
|
||
|
HKEY hKeyId, hKeyShell, hKeyAction;
|
||
|
int i, j;
|
||
|
|
||
|
if(!(hName=GetEditString(hWndName)))
|
||
|
goto Error2;
|
||
|
if(wErrMsg=GetErrMsg((WORD)RegOpenKey(HKEY_CLASSES_ROOT, LocalLock(hId),
|
||
|
&hKeyId)))
|
||
|
goto Error3;
|
||
|
if(wErrMsg=GetErrMsg((WORD)RegCreateKey(hKeyId, szShell, &hKeyShell)))
|
||
|
goto Error4;
|
||
|
if(wErrMsg=GetErrMsg((WORD)RegSetValue(hKeyId, szNull, (DWORD)REG_SZ,
|
||
|
LocalLock(hName), 0L)))
|
||
|
goto Error5;
|
||
|
|
||
|
for(i=0, phTemp=pLocalVals; i<NUMACTIONS; ++i) {
|
||
|
if(wErrMsg=GetErrMsg((WORD)RegCreateKey(hKeyShell, ppActionIds[i],
|
||
|
&hKeyAction)))
|
||
|
goto Error5;
|
||
|
|
||
|
for(j=0; j<EDITSPERACTION; ++j, ++phTemp) {
|
||
|
if(*phTemp && (j<OFFSET_FIRSTDDE || cUsesDDE[i])) {
|
||
|
PSTR pTemp;
|
||
|
|
||
|
pTemp = LocalLock(*phTemp);
|
||
|
if((j==OFFSET_DDETOPIC && !lstrcmpi(pTemp, szSystem)) ||
|
||
|
(j==OFFSET_DDEAPP && !lstrcmpi(pTemp,
|
||
|
GetAppName(*(phTemp+OFFSET_COMMAND-OFFSET_DDEAPP)))))
|
||
|
RegDeleteKey(hKeyAction, ppCommands[j]);
|
||
|
else
|
||
|
wErrMsg = GetErrMsg((WORD)RegSetValue(hKeyAction, ppCommands[j],
|
||
|
(DWORD)REG_SZ, pTemp, 0L));
|
||
|
LocalUnlock(*phTemp);
|
||
|
if(wErrMsg)
|
||
|
goto Error5;
|
||
|
} else {
|
||
|
RegDeleteKey(hKeyAction, ppCommands[j]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyAction);
|
||
|
}
|
||
|
wErrMsg = NULL;
|
||
|
|
||
|
Error5:
|
||
|
LocalUnlock(hName);
|
||
|
RegCloseKey(hKeyShell);
|
||
|
Error4:
|
||
|
RegCloseKey(hKeyId);
|
||
|
Error3:
|
||
|
LocalUnlock(hId);
|
||
|
LocalFree(hName);
|
||
|
Error2:
|
||
|
return(wErrMsg);
|
||
|
}
|
||
|
|
||
|
WORD NEAR PASCAL ResetClassList(HWND hWndIdList, HWND hWndNameList)
|
||
|
{
|
||
|
HANDLE hClassId, hClassName;
|
||
|
HKEY hKeyClasses;
|
||
|
int i;
|
||
|
WORD wErrMsg;
|
||
|
|
||
|
/* Reset the name list */
|
||
|
SendMessage(hWndIdList, LB_RESETCONTENT, 0, 0L);
|
||
|
SendMessage(hWndNameList, LB_RESETCONTENT, 0, 0L);
|
||
|
|
||
|
if(wErrMsg=GetErrMsg((WORD)RegCreateKey(HKEY_CLASSES_ROOT, szNull,
|
||
|
&hKeyClasses)))
|
||
|
goto Error1;
|
||
|
|
||
|
for(i=0; MyEnumKey(hKeyClasses, i, &hClassId)==ERROR_SUCCESS && !wErrMsg;
|
||
|
++i) {
|
||
|
int nId;
|
||
|
PSTR pClassId;
|
||
|
|
||
|
pClassId = LocalLock(hClassId);
|
||
|
if(*pClassId=='.' || (wErrMsg=MyGetClassName(hClassId, &hClassName)))
|
||
|
goto Error2;
|
||
|
|
||
|
wErrMsg = IDS_OUTOFMEMORY;
|
||
|
if((nId=(int)SendMessage(hWndNameList, LB_ADDSTRING, 0,
|
||
|
(DWORD)((LPSTR)LocalLock(hClassName))))==LB_ERR
|
||
|
|| SendMessage(hWndIdList, LB_INSERTSTRING, nId,
|
||
|
(DWORD)((LPSTR)pClassId))==LB_ERR)
|
||
|
goto Error3;
|
||
|
|
||
|
wErrMsg = NULL;
|
||
|
Error3:
|
||
|
LocalUnlock(hClassName);
|
||
|
LocalFree(hClassName);
|
||
|
Error2:
|
||
|
LocalUnlock(hClassId);
|
||
|
LocalFree(hClassId);
|
||
|
}
|
||
|
|
||
|
SendMessage(hWndNameList, LB_SETTOPINDEX, 0, 0L);
|
||
|
SendMessage(hWndNameList, LB_SETCURSEL, 0, 0L);
|
||
|
|
||
|
RegCloseKey(hKeyClasses);
|
||
|
Error1:
|
||
|
return(wErrMsg);
|
||
|
}
|
||
|
|
||
|
WORD NEAR PASCAL GetLocalCopies(HWND hWndName, HANDLE hId)
|
||
|
{
|
||
|
HKEY hKeyId, hKeyShell, hSubKey;
|
||
|
HANDLE hName, *phTemp;
|
||
|
WORD wErrMsg = IDS_OUTOFMEMORY;
|
||
|
int i, j;
|
||
|
|
||
|
if(!pLocalVals) {
|
||
|
HANDLE hLocalVals;
|
||
|
|
||
|
if(!(hLocalVals=LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT,
|
||
|
NUMACTIONS*EDITSPERACTION*sizeof(HANDLE)))
|
||
|
|| !(pLocalVals=(HANDLE *)LocalLock(hLocalVals)))
|
||
|
goto Error1;
|
||
|
}
|
||
|
|
||
|
for(i=0, phTemp=pLocalVals; i<NUMACTIONS; ++i) {
|
||
|
cUsesDDE[i] = 0;
|
||
|
|
||
|
for(j=0; j<EDITSPERACTION; ++j, ++phTemp) {
|
||
|
if(*phTemp) {
|
||
|
LocalFree(*phTemp);
|
||
|
*phTemp = NULL;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
SendMessage(hWndName, WM_SETTEXT, 0, (DWORD)((LPSTR)szNull));
|
||
|
if(!hId)
|
||
|
return(NULL);
|
||
|
|
||
|
if(wErrMsg=GetErrMsg((WORD)RegOpenKey(HKEY_CLASSES_ROOT, LocalLock(hId),
|
||
|
&hKeyId)))
|
||
|
goto Error3;
|
||
|
if(wErrMsg=GetErrMsg((WORD)RegCreateKey(hKeyId, szShell, &hKeyShell)))
|
||
|
goto Error4;
|
||
|
|
||
|
if(wErrMsg=GetErrMsg((WORD)MyQueryValue(hKeyId, szNull, &hName)))
|
||
|
goto Error5;
|
||
|
SendMessage(hWndName, WM_SETTEXT, 0, (DWORD)((LPSTR)LocalLock(hName)));
|
||
|
LocalUnlock(hName);
|
||
|
LocalFree(hName);
|
||
|
|
||
|
for(i=0, phTemp=pLocalVals; i<NUMACTIONS; ++i) {
|
||
|
if(wErrMsg=GetErrMsg((WORD)RegCreateKey(hKeyShell, ppActionIds[i],
|
||
|
&hSubKey)))
|
||
|
goto Error5;
|
||
|
|
||
|
for(j=0; j<EDITSPERACTION; ++j, ++phTemp) {
|
||
|
if((wErrMsg=(WORD)MyQueryValue(hSubKey, ppCommands[j], phTemp))
|
||
|
!=(WORD)ERROR_BADKEY && (wErrMsg=GetErrMsg(wErrMsg)))
|
||
|
goto Error5;
|
||
|
|
||
|
if(j>=OFFSET_FIRSTDDE) {
|
||
|
if(*phTemp)
|
||
|
cUsesDDE[i] = 1;
|
||
|
else if(j == OFFSET_DDETOPIC) {
|
||
|
*phTemp = StringToLocalHandle(szSystem, LMEM_MOVEABLE);
|
||
|
} else if(j == OFFSET_DDEAPP) {
|
||
|
HANDLE hTemp;
|
||
|
|
||
|
if(hTemp = *(phTemp-(OFFSET_DDEAPP+OFFSET_COMMAND)))
|
||
|
*phTemp = StringToLocalHandle(GetAppName(hTemp),
|
||
|
LMEM_MOVEABLE);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hSubKey);
|
||
|
}
|
||
|
|
||
|
wErrMsg = NULL;
|
||
|
Error5:
|
||
|
RegCloseKey(hKeyShell);
|
||
|
Error4:
|
||
|
RegCloseKey(hKeyId);
|
||
|
Error3:
|
||
|
LocalUnlock(hId);
|
||
|
Error1:
|
||
|
return(wErrMsg);
|
||
|
}
|
||
|
|