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

📄 safearrayreleasetest.java

📁 用java和windows的word应用的通用编程接口 关联起来
💻 JAVA
字号:
package com.jacob.com;

/**
 * SF 1085370
	In my understatnding, an instance of SafeArray java
	class has a
	value of a pointer to VARIANT structure that contains a
	pointer to
	a SAFEARRAY strucuture.
	
	On the other hand, we can create a Variant object from
	the
	SafeArray object like this:
	SafeArray sa = ...;
	Variant val = new Variant(sa);
	the val object has a pointer to another VARIANT
	structure that
	contains a pointer to the same SAFEARRAY structure.
	
	In this case, the val object has a pointer to another
	VARIANT that
	contains a pointer to the same SAFEARRAY like this:
	
	+-----------+
	|SafeArray  | +------------+ 
	| m_pV--->VARIANT(a) |
	+-----------+ | VT_ARRAY| +---------+
	| parray---->SAFEARRAY|
	+------------+ +^--------+
	|
	+-----------+ |
	|Variant    | +------------+ |
	| m_pVariant--->VARIANT(b) | |
	+-----------+ | VT_ARRAY| |
	| parray-----+
	+------------+
	
	When previous objects are rereased by
	ComThread.Release(),
	first the VARIANT(a) is released by VariantClear()
	function,
	and second the VARIANT(b) is released by VariantClear()
	function too.
	But the SAFEARRAY was already released by the
	VARIANT(a).
	
	So, in my enviroment (WinXP + J2SDK 1.4.1) the
	following java program
	is sometimes crash with EXCEPTION_ACCESS_VIOLATION.

	
	To solve this problem, it is nessesary to copy the
	SAFEARRAY like this:
	
	+-----------+
	|Variant | +------------+
	| m_pVariant--->VARIANT(a) |
	+-----------+ | VT_ARRAY| +---------+
	| parray---->SAFEARRAY|
	+------------+ +|--------+
	|
	+-----------+ | copySA()
	|SafeArray | +------------+ |
	| m_pV--->VARIANT(b) | V
	+-----------+ | VT_ARRAY| +---------+
	| parray---->SAFEARRAY|
	+------------+ +---------+
 */

public class SafeArrayReleaseTest 
{
    final static int MAX = 300; 
    public static void main(String[] args) 
    {
        int count;
        System.out.println("Starting test for max = "+MAX);
        for(count = 1; count<MAX; count++)
        {
            int i = 0;
            try 
            {
                ComThread.InitMTA();
                for (i = 0; i < count; i++) 
                {
                    SafeArray a1 = new SafeArray(Variant.VariantVariant, 2);
                    a1.setVariant(0, new Variant("foo"));
                    a1.setVariant(1, new Variant("bar"));
                    Variant v = new Variant(a1);
                    SafeArray a2 = v.toSafeArray(true);
                }
                ComThread.Release();
                System.gc();
                //System.out.print(".");
            } 
            catch (Exception e) 
            {
                System.out.println("\nTest fails with i = " + i + " (max = "+MAX+")");
                e.printStackTrace();
                break;
            }
        }
        System.gc();
        System.out.println("\nTest ends with count = " + count + " (max = "+MAX+")");
    }
}

⌨️ 快捷键说明

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