Browser上でScriptを実行する

DWTのBrowserクラスには、SWT3.Xのexecute()が存在しないので、CBrowserというカスタムコントロールをつくり、SWTからスクリプト実行メソッドを移植しました。

ほぼ、SWTそのままです。

/* IBM Corporation - initial API and implementation */

// スクリプトを実行
void execute(char[] script)
{
    if (script.length == 0) {
        return;
    }
    /* get IHTMLDocument2 */
    char[][] args;
    
    args ~= "Document";
    int[] rgdispid = automation.getIDsOfNames(args); //$NON-NLS-1$
    int dispIdMember = rgdispid[0];
    Variant pVarResult = automation.getProperty(dispIdMember);
    if (pVarResult == null || pVarResult.getType() == COM.VT_EMPTY) return false;
    OleAutomation document = pVarResult.getAutomation();
    pVarResult.dispose();
    
    /* get IHTMLWindow2 */
    args = null;
    args ~= "parentWindow";
    rgdispid = document.getIDsOfNames(args); //$NON-NLS-1$ 
    dispIdMember = rgdispid[0];
    pVarResult = document.getProperty(dispIdMember);
    OleAutomation ihtmlWindow2 = pVarResult.getAutomation();
    pVarResult.dispose();
    document.dispose();
    
    args = null;
    args ~= "execScript";
    args ~= "code";
    rgdispid = ihtmlWindow2.getIDsOfNames(args); //$NON-NLS-1$  //$NON-NLS-2$
    Variant[] rgvarg = new Variant[1];
    rgvarg[0] = new Variant(script);
    int[] rgdispidNamedArgs = new int[1];
    rgdispidNamedArgs[0] = rgdispid[1];
    pVarResult = ihtmlWindow2.invoke(rgdispid[0], rgvarg, rgdispidNamedArgs);
    rgvarg[0].dispose();
    ihtmlWindow2.dispose();
    if (pVarResult == null) return false;
    pVarResult.dispose();
    
    return true;
}

これは、便利です。