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

📄 tclwinreg.c

📁 这是leon3处理器的交叉编译链
💻 C
📖 第 1 页 / 共 3 页
字号:
	    result = ERROR_SUCCESS;	} else {	    result = (*regWinProcs->regOpenKeyExProc)(rootKey, keyName, 0,		    mode, keyPtr);	}    }    Tcl_DStringFree(&buf);    /*     * Be sure to close the root key since we are done with it now.     */    if (hostName) {	RegCloseKey(rootKey);    }    return result;}/* *---------------------------------------------------------------------- * * ParseKeyName -- * *	This function parses a key name into the host, root, and subkey *	parts. * * Results: *	The pointers to the start of the host and subkey names are *	returned in the hostNamePtr and keyNamePtr variables.  The *	specified root HKEY is returned in rootKeyPtr.  Returns *	a standard Tcl result. * * * Side effects: *	Modifies the name string by inserting nulls. * *---------------------------------------------------------------------- */static intParseKeyName(    Tcl_Interp *interp,		/* Current interpreter. */    char *name,    char **hostNamePtr,    HKEY *rootKeyPtr,    char **keyNamePtr){    char *rootName;    int result, index;    Tcl_Obj *rootObj, *resultPtr = Tcl_GetObjResult(interp);    /*     * Split the key into host and root portions.     */    *hostNamePtr = *keyNamePtr = rootName = NULL;    if (name[0] == '\\') {	if (name[1] == '\\') {	    *hostNamePtr = name;	    for (rootName = name+2; *rootName != '\0'; rootName++) {		if (*rootName == '\\') {		    *rootName++ = '\0';		    break;		}	    }	}    } else {	rootName = name;    }    if (!rootName) {	Tcl_AppendStringsToObj(resultPtr, "bad key \"", name,		"\": must start with a valid root", NULL);	return TCL_ERROR;    }    /*     * Split the root into root and subkey portions.     */    for (*keyNamePtr = rootName; **keyNamePtr != '\0'; (*keyNamePtr)++) {	if (**keyNamePtr == '\\') {	    **keyNamePtr = '\0';	    (*keyNamePtr)++;	    break;	}    }    /*     * Look for a matching root name.     */    rootObj = Tcl_NewStringObj(rootName, -1);    result = Tcl_GetIndexFromObj(interp, rootObj, rootKeyNames, "root name",	    TCL_EXACT, &index);    Tcl_DecrRefCount(rootObj);    if (result != TCL_OK) {	return TCL_ERROR;    }    *rootKeyPtr = rootKeys[index];    return TCL_OK;}/* *---------------------------------------------------------------------- * * RecursiveDeleteKey -- * *	This function recursively deletes all the keys below a starting *	key.  Although Windows 95 does this automatically, we still need *	to do this for Windows NT. * * Results: *	Returns a Windows error code. * * Side effects: *	Deletes all of the keys and values below the given key. * *---------------------------------------------------------------------- */static DWORDRecursiveDeleteKey(    HKEY startKey,		/* Parent of key to be deleted. */    CONST char *keyName)	/* Name of key to be deleted in external				 * encoding, not UTF. */{    DWORD result, size, maxSize;    Tcl_DString subkey;    HKEY hKey;    /*     * Do not allow NULL or empty key name.     */    if (!keyName || *keyName == '\0') {	return ERROR_BADKEY;    }    result = (*regWinProcs->regOpenKeyExProc)(startKey, keyName, 0,	    KEY_ENUMERATE_SUB_KEYS | DELETE | KEY_QUERY_VALUE, &hKey);    if (result != ERROR_SUCCESS) {	return result;    }    result = (*regWinProcs->regQueryInfoKeyProc)(hKey, NULL, NULL, NULL, NULL,	    &maxSize, NULL, NULL, NULL, NULL, NULL, NULL);    maxSize++;    if (result != ERROR_SUCCESS) {	return result;    }    Tcl_DStringInit(&subkey);    Tcl_DStringSetLength(&subkey,	    (int) ((regWinProcs->useWide) ? maxSize * 2 : maxSize));    while (result == ERROR_SUCCESS) {	/*	 * Always get index 0 because key deletion changes ordering.	 */	size = maxSize;	result=(*regWinProcs->regEnumKeyExProc)(hKey, 0,		Tcl_DStringValue(&subkey), &size, NULL, NULL, NULL, NULL);	if (result == ERROR_NO_MORE_ITEMS) {	    result = (*regWinProcs->regDeleteKeyProc)(startKey, keyName);	    break;	} else if (result == ERROR_SUCCESS) {	    result = RecursiveDeleteKey(hKey, Tcl_DStringValue(&subkey));	}    }    Tcl_DStringFree(&subkey);    RegCloseKey(hKey);    return result;}/* *---------------------------------------------------------------------- * * SetValue -- * *	This function sets the contents of a registry value.  If *	the key or value does not exist, it will be created.  If it *	does exist, then the data and type will be replaced. * * Results: *	Returns a normal Tcl result. * * Side effects: *	May create new keys or values. * *---------------------------------------------------------------------- */static intSetValue(    Tcl_Interp *interp,		/* Current interpreter. */    Tcl_Obj *keyNameObj,	/* Name of key. */    Tcl_Obj *valueNameObj,	/* Name of value to set. */    Tcl_Obj *dataObj,		/* Data to be written. */    Tcl_Obj *typeObj)		/* Type of data to be written. */{    DWORD type, result;    HKEY key;    int length;    char *valueName;    Tcl_Obj *resultPtr;    Tcl_DString nameBuf;    if (typeObj == NULL) {	type = REG_SZ;    } else if (Tcl_GetIndexFromObj(interp, typeObj, typeNames, "type",	    0, (int *) &type) != TCL_OK) {	if (Tcl_GetIntFromObj(NULL, typeObj, (int*) &type) != TCL_OK) {	    return TCL_ERROR;	}	Tcl_ResetResult(interp);    }    if (OpenKey(interp, keyNameObj, KEY_ALL_ACCESS, 1, &key) != TCL_OK) {	return TCL_ERROR;    }    valueName = Tcl_GetStringFromObj(valueNameObj, &length);    valueName = (char *) Tcl_WinUtfToTChar(valueName, length, &nameBuf);    resultPtr = Tcl_GetObjResult(interp);    if (type == REG_DWORD || type == REG_DWORD_BIG_ENDIAN) {	DWORD value;	if (Tcl_GetIntFromObj(interp, dataObj, (int*) &value) != TCL_OK) {	    RegCloseKey(key);	    Tcl_DStringFree(&nameBuf);	    return TCL_ERROR;	}	value = ConvertDWORD(type, value);	result = (*regWinProcs->regSetValueExProc)(key, valueName, 0, type,		(BYTE*) &value, sizeof(DWORD));    } else if (type == REG_MULTI_SZ) {	Tcl_DString data, buf;	int objc, i;	Tcl_Obj **objv;	if (Tcl_ListObjGetElements(interp, dataObj, &objc, &objv) != TCL_OK) {	    RegCloseKey(key);	    Tcl_DStringFree(&nameBuf);	    return TCL_ERROR;	}	/*	 * Append the elements as null terminated strings.  Note that	 * we must not assume the length of the string in case there are	 * embedded nulls, which aren't allowed in REG_MULTI_SZ values.	 */	Tcl_DStringInit(&data);	for (i = 0; i < objc; i++) {	    Tcl_DStringAppend(&data, Tcl_GetString(objv[i]), -1);	    /*	     * Add a null character to separate this value from the next.	     * We accomplish this by growing the string by one byte.  Since the	     * DString always tacks on an extra null byte, the new byte will	     * already be set to null.	     */	    Tcl_DStringSetLength(&data, Tcl_DStringLength(&data)+1);	}	Tcl_WinUtfToTChar(Tcl_DStringValue(&data), Tcl_DStringLength(&data)+1,		&buf);	result = (*regWinProcs->regSetValueExProc)(key, valueName, 0, type,		(BYTE *) Tcl_DStringValue(&buf),		(DWORD) Tcl_DStringLength(&buf));	Tcl_DStringFree(&data);	Tcl_DStringFree(&buf);    } else if (type == REG_SZ || type == REG_EXPAND_SZ) {	Tcl_DString buf;	char *data = Tcl_GetStringFromObj(dataObj, &length);	data = (char *) Tcl_WinUtfToTChar(data, length, &buf);	/*	 * Include the null in the length, padding if needed for Unicode.	 */	if (regWinProcs->useWide) {	    Tcl_DStringSetLength(&buf, Tcl_DStringLength(&buf)+1);	}	length = Tcl_DStringLength(&buf) + 1;	result = (*regWinProcs->regSetValueExProc)(key, valueName, 0, type,		(BYTE*)data, (DWORD) length);	Tcl_DStringFree(&buf);    } else {	char *data;	/*	 * Store binary data in the registry.	 */	data = Tcl_GetByteArrayFromObj(dataObj, &length);	result = (*regWinProcs->regSetValueExProc)(key, valueName, 0, type,		(BYTE *)data, (DWORD) length);    }    Tcl_DStringFree(&nameBuf);    RegCloseKey(key);    if (result != ERROR_SUCCESS) {	Tcl_AppendToObj(resultPtr, "unable to set value: ", -1);	AppendSystemError(interp, result);	return TCL_ERROR;    }    return TCL_OK;}/* *---------------------------------------------------------------------- * * BroadcastValue -- * *	This function broadcasts a WM_SETTINGCHANGE message to indicate *	to other programs that we have changed the contents of a registry *	value. * * Results: *	Returns a normal Tcl result. * * Side effects: *	Will cause other programs to reload their system settings. * *---------------------------------------------------------------------- */static intBroadcastValue(    Tcl_Interp *interp,		/* Current interpreter. */    int objc,			/* Number of arguments. */    Tcl_Obj * CONST objv[])	/* Argument values. */{    DWORD result, sendResult;    UINT timeout = 3000;    int len;    char *str;    Tcl_Obj *objPtr;    if ((objc != 3) && (objc != 5)) {	Tcl_WrongNumArgs(interp, 2, objv, "keyName ?-timeout millisecs?");	return TCL_ERROR;    }    if (objc > 3) {	str = Tcl_GetStringFromObj(objv[3], &len);	if ((len < 2) || (*str != '-') || strncmp(str, "-timeout", (size_t) len)) {	    Tcl_WrongNumArgs(interp, 2, objv, "keyName ?-timeout millisecs?");	    return TCL_ERROR;	}	if (Tcl_GetIntFromObj(interp, objv[4], (int *) &timeout) != TCL_OK) {	    return TCL_ERROR;	}    }    str = Tcl_GetStringFromObj(objv[2], &len);    if (len == 0) {	str = NULL;    }    /*     * Use the ignore the result.     */    result = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE,	    (WPARAM) 0, (LPARAM) str, SMTO_ABORTIFHUNG, timeout, &sendResult);    objPtr = Tcl_NewObj();    Tcl_ListObjAppendElement(NULL, objPtr, Tcl_NewIntObj((int) result));    Tcl_ListObjAppendElement(NULL, objPtr, Tcl_NewIntObj((int) sendResult));    Tcl_SetObjResult(interp, objPtr);    return TCL_OK;}/* *---------------------------------------------------------------------- * * AppendSystemError -- * *	This routine formats a Windows system error message and places *	it into the interpreter result. * * Results: *	None. * * Side effects: *	None. * *---------------------------------------------------------------------- */static voidAppendSystemError(    Tcl_Interp *interp,		/* Current interpreter. */    DWORD error)		/* Result code from error. */{    int length;    WCHAR *wMsgPtr;    char *msg;    char id[TCL_INTEGER_SPACE], msgBuf[24 + TCL_INTEGER_SPACE];    Tcl_DString ds;    Tcl_Obj *resultPtr = Tcl_GetObjResult(interp);    length = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM	    | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, error,	    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (WCHAR *) &wMsgPtr,	    0, NULL);    if (length == 0) {	char *msgPtr;	length = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM		| FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, error,		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (char *) &msgPtr,		0, NULL);	if (length > 0) {	    wMsgPtr = (WCHAR *) LocalAlloc(LPTR, (length + 1) * sizeof(WCHAR));	    MultiByteToWideChar(CP_ACP, 0, msgPtr, length + 1, wMsgPtr,		    length + 1);	    LocalFree(msgPtr);	}    }    if (length == 0) {	if (error == ERROR_CALL_NOT_IMPLEMENTED) {	    msg = "function not supported under Win32s";	} else {	    sprintf(msgBuf, "unknown error: %ld", error);	    msg = msgBuf;	}    } else {	Tcl_Encoding encoding;	encoding = Tcl_GetEncoding(NULL, "unicode");	Tcl_ExternalToUtfDString(encoding, (char *) wMsgPtr, -1, &ds);	Tcl_FreeEncoding(encoding);	LocalFree(wMsgPtr);	msg = Tcl_DStringValue(&ds);	length = Tcl_DStringLength(&ds);	/*	 * Trim the trailing CR/LF from the system message.	 */	if (msg[length-1] == '\n') {	    msg[--length] = 0;	}	if (msg[length-1] == '\r') {	    msg[--length] = 0;	}    }    sprintf(id, "%ld", error);    Tcl_SetErrorCode(interp, "WINDOWS", id, msg, (char *) NULL);    Tcl_AppendToObj(resultPtr, msg, length);    if (length != 0) {	Tcl_DStringFree(&ds);    }}/* *---------------------------------------------------------------------- * * ConvertDWORD -- * *	This function determines whether a DWORD needs to be byte *	swapped, and returns the appropriately swapped value. * * Results: *	Returns a converted DWORD. * * Side effects: *	None. * *---------------------------------------------------------------------- */static DWORDConvertDWORD(    DWORD type,			/* Either REG_DWORD or REG_DWORD_BIG_ENDIAN */    DWORD value)		/* The value to be converted. */{    DWORD order = 1;    DWORD localType;    /*     * Check to see if the low bit is in the first byte.     */    localType = (*((char*)(&order)) == 1) ? REG_DWORD : REG_DWORD_BIG_ENDIAN;    return (type != localType) ? SWAPLONG(value) : value;}

⌨️ 快捷键说明

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