• 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();
            }

        }
  • 相关阅读:
    vue项目index.html缓存
    vue刷新当前页面
    keep-alive
    JS刷算法题:二叉树
    CSS动效集锦,视觉魔法的碰撞与融合(三)
    算法:栈和队列题目集合(一)
    浅谈设计模式(二):装饰器模式|中介模式|原型模式
    聊聊JS的二进制家族:Blob、ArrayBuffer和Buffer
    浅谈设计模式(一):状态模式|外观模式|代理模式
    纵论WebAssembly,JS在性能逆境下召唤强援
  • 原文地址:https://www.cnblogs.com/crabo/p/592102.html
Copyright © 2020-2023  润新知