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

📄 variant.java

📁 源码为Eclipse开源开发平台桌面开发工具SWT的源代码,
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
}/** * Returns the Java float represented by this Variant. * * <p>If this Variant does not contain a Java float, an attempt is made to * coerce the Variant type into a Java float.  If this fails, an error is thrown. * * @return the Java float represented by this Variant * * @exception SWTError * <ul><li>ERROR_CANNOT_CHANGE_VARIANT_TYPE when type of Variant can not be coerced into a float</ul> */public float getFloat() {	if (type == COM.VT_EMPTY) {		OLE.error(OLE.ERROR_CANNOT_CHANGE_VARIANT_TYPE, -1);	}	if (type == COM.VT_R4) {		return floatData;	}	// try to coerce the value to the desired type	int oldPtr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, sizeof);	int newPtr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, sizeof);	try {		getData(oldPtr);		int result = COM.VariantChangeType(newPtr, oldPtr, (short) 0, COM.VT_R4);		if (result != COM.S_OK)			OLE.error(OLE.ERROR_CANNOT_CHANGE_VARIANT_TYPE, result);		Variant floatVar = new Variant();		floatVar.setData(newPtr);		return floatVar.getFloat();	} finally {		COM.VariantClear(oldPtr);		OS.GlobalFree(oldPtr);		COM.VariantClear(newPtr);		OS.GlobalFree(newPtr);	}	}/** * Returns the Java int represented by this Variant. * * <p>If this Variant does not contain a Java int, an attempt is made to * coerce the Variant type into a Java int.  If this fails, an error is thrown. * * @return the Java int represented by this Variant * * @exception SWTError * <ul><li>ERROR_CANNOT_CHANGE_VARIANT_TYPE when type of Variant can not be coerced into a int</ul> */public int getInt() {	if (type == COM.VT_EMPTY) {		OLE.error(OLE.ERROR_CANNOT_CHANGE_VARIANT_TYPE, -1);	}	if (type == COM.VT_I4) {		return intData;	}			// try to coerce the value to the desired type	int oldPtr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, sizeof);	int newPtr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, sizeof);	try {		getData(oldPtr);		int result = COM.VariantChangeType(newPtr, oldPtr, (short) 0, COM.VT_I4);		if (result != COM.S_OK)			OLE.error(OLE.ERROR_CANNOT_CHANGE_VARIANT_TYPE, result);		Variant intVar = new Variant();		intVar.setData(newPtr);		return intVar.getInt();	} finally {		COM.VariantClear(oldPtr);		OS.GlobalFree(oldPtr);		COM.VariantClear(newPtr);		OS.GlobalFree(newPtr);	}}/** * Returns the Java short represented by this Variant. * * <p>If this Variant does not contain a Java short, an attempt is made to * coerce the Variant type into a Java short.  If this fails, an error is thrown. * * @return the Java short represented by this Variant * * @exception SWTError * <ul><li>ERROR_CANNOT_CHANGE_VARIANT_TYPE when type of Variant can not be coerced into a short</ul> */public short getShort() {	if (type == COM.VT_EMPTY) {		OLE.error(OLE.ERROR_CANNOT_CHANGE_VARIANT_TYPE, -1);	}	if (type == COM.VT_I2) {		return shortData;	}			// try to coerce the value to the desired type	int oldPtr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, sizeof);	int newPtr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, sizeof);	try {		getData(oldPtr);		int result = COM.VariantChangeType(newPtr, oldPtr, (short) 0, COM.VT_I2);		if (result != COM.S_OK)			OLE.error(OLE.ERROR_CANNOT_CHANGE_VARIANT_TYPE, result);		Variant shortVar = new Variant();		shortVar.setData(newPtr);		return shortVar.getShort();	} finally {		COM.VariantClear(oldPtr);		OS.GlobalFree(oldPtr);		COM.VariantClear(newPtr);		OS.GlobalFree(newPtr);	}	}/** * Returns the Java String represented by this Variant. * * <p>If this Variant does not contain a Java String, an attempt is made to * coerce the Variant type into a Java String.  If this fails, an error is thrown. * * @return the Java String represented by this Variant * * @exception SWTError * <ul><li>ERROR_CANNOT_CHANGE_VARIANT_TYPE when type of Variant can not be coerced into a String</ul> */public String getString() {	if (type == COM.VT_EMPTY) {		OLE.error(OLE.ERROR_CANNOT_CHANGE_VARIANT_TYPE, -1);	}	if (type == COM.VT_BSTR) {		return stringData;	}	// try to coerce the value to the desired type	int oldPtr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, sizeof);	int newPtr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, sizeof);	try {		getData(oldPtr);		int result = COM.VariantChangeType(newPtr, oldPtr, (short) 0, COM.VT_BSTR);		if (result != COM.S_OK)			OLE.error(OLE.ERROR_CANNOT_CHANGE_VARIANT_TYPE, result);		Variant stringVar = new Variant();		stringVar.setData(newPtr);		return stringVar.getString();				} finally {		COM.VariantClear(oldPtr);		OS.GlobalFree(oldPtr);		COM.VariantClear(newPtr);		OS.GlobalFree(newPtr);	}}/** * Returns the ytpe of the variant type.  This will be an OLE.VT_* value or * a bitwise combination of OLE.VT_* values as in the case of  * OLE.VT_BSTR | OLE.VT_BYREF. *  * @return the type of the variant data *  * @since 2.0 */public short getType() {	return type;}/** * Returns the IUnknown object represented by this Variant. * * <p>If this Variant does not contain an IUnknown object, an attempt is made to * coerce the Variant type into an IUnknown object.  If this fails, an error is * thrown. * * @return the IUnknown object represented by this Variant * * @exception SWTError * <ul><li>ERROR_CANNOT_CHANGE_VARIANT_TYPE when type of Variant can not be coerced into  *			an IUnknown object</ul> */public IUnknown getUnknown() {	if (type == COM.VT_EMPTY) {		OLE.error(OLE.ERROR_CANNOT_CHANGE_VARIANT_TYPE, -1);	}	if (type == COM.VT_UNKNOWN) {		return unknownData;	}	// try to coerce the value to the desired type	int oldPtr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, sizeof);	int newPtr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, sizeof);	try {		getData(oldPtr);		int result = COM.VariantChangeType(newPtr, oldPtr, (short) 0, COM.VT_UNKNOWN);		if (result != COM.S_OK)			OLE.error(OLE.ERROR_CANNOT_CHANGE_VARIANT_TYPE, result);		Variant unknownVar = new Variant();		unknownVar.setData(newPtr);		return unknownVar.getUnknown();	} finally {		COM.VariantClear(oldPtr);		OS.GlobalFree(oldPtr);		COM.VariantClear(newPtr); // Note: This must absolutely be done AFTER the 		                          // IUnknown object is created as Variant Clear 		                          // will result in a Release being performed on the 		                          // Dispatch object		OS.GlobalFree(newPtr);	}}/** * Update the by reference value of this variant with a new boolean value. *  * @param val the new boolean value *  * @exception SWTError * <ul><li>ERROR_CANNOT_CHANGE_VARIANT_TYPE when type of Variant is not  *			a (VT_BYREF | VT_BOOL) object</ul> * * @since 2.1 */public void setByRef(boolean val) {	if ((type & COM.VT_BYREF) == 0 || (type & COM.VT_BOOL) == 0) {		OLE.error(OLE.ERROR_CANNOT_CHANGE_VARIANT_TYPE);	}	COM.MoveMemory(byRefPtr, new short[]{val ? COM.VARIANT_TRUE : COM.VARIANT_FALSE}, 2);}/** * Update the by reference value of this variant with a new float value. *  * @param val the new float value *  * @exception SWTError * <ul><li>ERROR_CANNOT_CHANGE_VARIANT_TYPE when type of Variant is not  *			a (VT_BYREF | VT_R4) object</ul> * * @since 2.1 */public void setByRef(float val) {	if ((type & COM.VT_BYREF) == 0 || (type & COM.VT_R4) == 0) {		OLE.error(OLE.ERROR_CANNOT_CHANGE_VARIANT_TYPE);	}	COM.MoveMemory(byRefPtr, new float[]{val}, 4);	}/** * Update the by reference value of this variant with a new integer value. *  * @param val the new integer value *  * @exception SWTError * <ul><li>ERROR_CANNOT_CHANGE_VARIANT_TYPE when type of Variant is not  *			a (VT_BYREF | VT_I4) object</ul> * * @since 2.1 */public void setByRef(int val) {	if ((type & COM.VT_BYREF) == 0 || (type & COM.VT_I4) == 0) {		OLE.error(OLE.ERROR_CANNOT_CHANGE_VARIANT_TYPE);	}	COM.MoveMemory(byRefPtr, new int[]{val}, 4);}/** * Update the by reference value of this variant with a new short value. *  * @param val the new short value *  * @exception SWTError * <ul><li>ERROR_CANNOT_CHANGE_VARIANT_TYPE when type of Variant is not  *			a (VT_BYREF | VT_I2) object</ul> * * @since 2.1 */public void setByRef(short val) {	if ((type & COM.VT_BYREF) == 0 || (type & COM.VT_I2) == 0) {		OLE.error(OLE.ERROR_CANNOT_CHANGE_VARIANT_TYPE);	}	COM.MoveMemory(byRefPtr, new short[]{val}, 2);}void setData(int pData){	if (pData == 0) OLE.error(OLE.ERROR_INVALID_ARGUMENT);	short[] dataType = new short[1];	COM.MoveMemory(dataType, pData, 2);	type = dataType[0];	if ((type & COM.VT_BYREF) == COM.VT_BYREF) {		int[] newByRefPtr = new int[1];		OS.MoveMemory(newByRefPtr, pData + 8, 4);		byRefPtr = newByRefPtr[0];		return;	}		switch (type) {		case COM.VT_EMPTY :			break;		case COM.VT_BOOL :			short[] newBooleanData = new short[1];			COM.MoveMemory(newBooleanData, pData + 8, 2);			booleanData = (newBooleanData[0] != COM.VARIANT_FALSE);			break;		case COM.VT_R4 :			float[] newFloatData = new float[1];			COM.MoveMemory(newFloatData, pData + 8, 4);			floatData = newFloatData[0];			break;		case COM.VT_I4 :			int[] newIntData = new int[1];			OS.MoveMemory(newIntData, pData + 8, 4);			intData = newIntData[0];			break;		case COM.VT_DISPATCH : {			int[] ppvObject = new int[1];			OS.MoveMemory(ppvObject, pData + 8, 4);			if (ppvObject[0] == 0) {				type = COM.VT_EMPTY;				break;			}			dispatchData = new IDispatch(ppvObject[0]);			dispatchData.AddRef();			break;		}		case COM.VT_UNKNOWN : {			int[] ppvObject = new int[1];			OS.MoveMemory(ppvObject, pData + 8, 4);			if (ppvObject[0] == 0) {				type = COM.VT_EMPTY;				break;			}			unknownData = new IUnknown(ppvObject[0]);			unknownData.AddRef();			break;		}		case COM.VT_I2 :			short[] newShortData = new short[1];			COM.MoveMemory(newShortData, pData + 8, 2);			shortData = newShortData[0];			break;		case COM.VT_BSTR :			// get the address of the memory in which the string resides			int[] hMem = new int[1];			OS.MoveMemory(hMem, pData + 8, 4);			if (hMem[0] == 0) {				type = COM.VT_EMPTY;				break;			}			// Get the size of the string from the OS - the size is expressed in number			// of bytes - each unicode character is 2 bytes.			int size = COM.SysStringByteLen(hMem[0]);			if (size > 0){				// get the unicode character array from the global memory and create a String				char[] buffer = new char[(size + 1) /2]; // add one to avoid rounding errors				COM.MoveMemory(buffer, hMem[0], size);				stringData = new String(buffer);			} else {				stringData = ""; //$NON-NLS-1$			}			break;			default :			// try coercing it into one of the known forms			int newPData = OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, Variant.sizeof);			if (COM.VariantChangeType(newPData, pData, (short) 0, COM.VT_R4) == COM.S_OK) {				setData(newPData);			} else if (COM.VariantChangeType(newPData, pData, (short) 0, COM.VT_I4) == COM.S_OK) {				setData(newPData);			} else if (COM.VariantChangeType(newPData, pData, (short) 0, COM.VT_BSTR) == COM.S_OK) {				setData(newPData);			}			COM.VariantClear(newPData);			OS.GlobalFree(newPData);			break;	}}}

⌨️ 快捷键说明

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