📄 variant.java
字号:
}/** * 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 + -