zoukankan      html  css  js  c++  java
  • Java SWT调用ActiveX实现

    1.首先需要获取ActiveX内部属性方法信息.
    参见[http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/]
    代码如下:

    2.得到类似下面结果
    METHOD (id = 11) : 
        Signature   : boolean TestFile(
    [] String strFileName)
        Description : null

    METHOD (id 
    = 12) : 
        Signature   : boolean TestApp(
    [] String * lpstrErr)
        Description : null
    注意,方法TestFile传递的参数是String, 方法TestApp传递的引用型String

    3.引用型参数工具类
    如果在TestApp传递String, 必将报Type Mismatch错误. 我们需要能转换成引用型的方法
    import org.eclipse.swt.internal.win32.OS;
    import org.eclipse.swt.internal.ole.win32.COM;

    public static Variant getIntByRef( int val )
          
    {
            
    int ptr = OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, 4);
            OS.MoveMemory(ptr, 
    new int[] {val}4 );
            Variant res 
    = new Variant( ptr, (short)(OLE.VT_I4 | OLE.VT_BYREF) );
            
    return res;
          }


        
    private static Variant getStringByRef( String text )
          
    {
            
    char[] data = (text+"\0").toCharArray();
            
    int ptr = COM.SysAllocString(data);
            
    int ptr2 = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, 4);
            COM.MoveMemory(ptr2, 
    new int[] {ptr}4);
            Variant v 
    = new Variant( ptr2, (short)(COM.VT_BYREF | COM.VT_BSTR));
            
    return v;
          }

    4. 现在我们可以调用AcitveX了
    public void createPartControl(Composite parent) {
            
    try {
                OleFrame frame 
    = new OleFrame(parent, SWT.NONE);
                OleClientSite clientSite 
    = new OleClientSite(frame, SWT.NONE, "Test.TestCtrl.1");            
                OleAutomation auto 
    = new OleAutomation(clientSite); 
                clientSite.doVerb(OLE.OLEIVERB_SHOW);
                
                
    int[] rgdispid = auto.getIDsOfNames(new String[]{"TestApp"});
                
    int dispIdMember = rgdispid[0];                
            
                Variant[] rgvarg 
    = new Variant[1]; 
                rgvarg[
    0= getStringByRef("");
                
                Variant pVarResult 
    = auto.invoke(dispIdMember, rgvarg);
                
    int errorMsg = rgvarg[0].getByRef();

                System.out.println(errorMsg);
                System.out.println(pVarResult);
                System.out.println(auto.getLastError());
                
            }
     catch (RuntimeException e) {
                e.printStackTrace();
            }

        }
  • 相关阅读:
    【POJ3069】Saruman's Army
    【POJ2453】An Easy Problem
    【POJ2386】Lake Counting
    【POJ2251】Dungeon Master
    【POJ1664】放苹果
    【基础】枚举学习笔记
    算法时空复杂度【OI缩水版】
    【POJ2018】Best Cow Fences
    【POJ3889】Fractal Streets(分形图)
    【BZOJ2296】随机种子(构造)
  • 原文地址:https://www.cnblogs.com/crabo/p/592102.html
Copyright © 2011-2022 走看看