论坛首页 编程语言技术论坛

D语言,想说爱你不容易

浏览 21885 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-28  

D语言,想说爱你不容易


D语言设计思想本身很先进,我不否认。但是...

我想在一个GUI中嵌入IE,用来显示HTML,CSS,进行DOM操作。这在脚本语言中,只要类似下面一行代码就能创建一个IE实例:

CreateObject("InternetExplorer.Application")

但在D里却这么难。

1 首先我看到juno这个项目好像可以创建COM,可惜很长时间不更新了,已经不能通过新版DMD编译。。。
   http://www.dsource.org/projects/juno

2 qiezi大侠写过一篇文章  D语言调用ActiveX(在窗口中嵌入ActiveX)
  http://www.cppblog.com/cpunion/archive/2005/11/11/1061.html
  http://qiezi.iteye.com/blog/266811
  但那是好久前,已经不能通过新版DMD编译。。郁闷中
 
3 oldrev大侠发表了修改版 juno.com.base,看到一线曙光
  http://dlang.group.iteye.com/group/blog/72602
  刚接触D,要用oldrev大侠的成果来创建IE实例,不知何从着手。。。
 
4 网上找com的文章,都是C++,C的实例,要是会C++多好,可是,如果我会C++,还用问这个问题吗
  犹豫,是否先学C++,再学D,狂闷。。。
 
5 圈子里高人很多,可是。。。


6 上D官方新闻组,官方论坛去问。。。
   好不容易,core32的作者jcc7给了个用oldrev修改版combase创建Microsoft Script Control,再用script脚本创建IE实例
   如何嵌入GUI,如何得到IE句柄,如何控制页面元素。。。
   用DMD1.013可以成功编译。离成功好像近了一步,路漫漫。。。  
  
   jcc7给的代码见本文附件

7 现在初浅的了解:
   要实现把IE嵌入GUI,有两种思路: 
   
   早期绑定,这个在D里实现很麻烦
   晚期绑定,就象脚本语言里用的那样
  
   qiezie说用IDispatch接口的方法效率比较低

   效率低点没有关系,谁能给个例子,用IDispatch接口实现创建IE实例?
  
   真的很希望得到你的帮助,没有C++基础学D这么难,创建嵌入GUI的IE竟然这么难以实现。
  
   D语言出现已经多年了,我知道不是D语言本身的问题,那么...

   第一次用D写程序就被卡住了。。。
   
   D,想说爱你不容易!
  

  20070429tuja补充:
真的非常感谢qiezi,在百忙之中,抽出宝贵个人时间,修改了core32,使之能够通过dmd1.013的编译!!

我按照下面的方法,已经成功编译了你修改的core32
http://dsource.org/projects/core32

1 Unzip ZIP in \dmd\src\core32
2 Open command prompt (cmd.exe=DOX Box).
3 Type PATH \dmd\bin;%PATH%
4 CD to the core32\win32 directory.
5 Exeute makelib.bat
6 Copy make32.lib to \dmd\lib directory. This directory is alread in compilers search path.
7 CD to \dmd\bin
8 Open sc.ini
Add "%@P%\..\src\core32" to compiler include search path

然后用qiezi提供的编译参数:
dmd ie.d -I..\core32 activex.d ..\core32\win32\win32.lib
编译了ie.d,可以成功启动IE。

我的目的是,把IE嵌入GUI,进行DOM操作。
不知道 AXO ie = new AXO("InternetExplorer.Application");得到的ie,怎么得到它的句柄,然后在DFL创建的窗体中,就可以SetParent() 到 Form.handle从而实现嵌入GUI了。

非常感谢qiezi及各位的指教。

 


  

 

 

 
  • vbscript_ie.zip (14.3 KB)
  • 描述: jcc7提供的,用oldrev修改版combase创建Microsoft Script Control,再用Microsoft Script Control创建IE的实例
  • 下载次数: 14
   发表时间:2007-04-28  
/*

Opens an Internet Explorer window using Juno (oldrev's modified version)
and the Microsoft Script Control.

    Written by jcc7 (technocrat7[AT-SIGN]gmail<dot>com)

*/


import std.stdio : writef, writefln;

import combase /+juno.com.core+/ : utf8ToBstr, bstrToUtf8;

import msscriptcontrol;
/* msscriptcontrol.d was generated by running a patched version of tlbimpd on
   Microsoft Script Control 1.0 (msscript.ocx) */


void main()
{
    IScriptControl objScript = ScriptControl.coCreate!(IScriptControl);
    objScript.set_Language(utf8ToBstr("VBScript"));

    wchar* lang;
    objScript.get_Language(lang);
    writefln(bstrToUtf8(lang));

    objScript.ExecuteStatement(utf8ToBstr(`
MsgBox "Get ready for Internet Explorer!"
Dim ieApp
Set ieApp = CreateObject("InternetExplorer.Application")
ieApp.Navigate("http://www.d-programming-language.org/")
ieApp.Visible = True
MsgBox "Yay for Juno!"
ieApp.Visible = False
Set ieApp = Nothing
    `));

}


0 请登录后投票
   发表时间:2007-04-28  
呵呵, jcc7 给的这个例子是用VB脚本创建IE,不是 D
0 请登录后投票
   发表时间:2007-04-28  
D用COM很难的原因是COM本身就很复杂,脚本语言掩盖了COM复杂性,现在在D里使用COM几乎是原始的API方式,原因是D没有相应的类库来封装COM。
我看当前D的发展阶段类似于90年左右的C++。
0 请登录后投票
   发表时间:2007-04-28  
用D真苦啊,第一个程序就卡住了。。。
我是不是去学c++呢,C++的实例代码很多

to oldrev:
jcc7 说你修改的Juno com很cool!

By the way, that update of Juno's COM module seems pretty cool. I hope the Juno project catches up to DMD 1.00, but in the meantime it looks like I can use oldrev's modified version to proceed with some experiments that I had been working on a few months ago.

0 请登录后投票
   发表时间:2007-04-28  
学C把,C++确实很难,等掌握了C再学不迟,或者到那时你已经决定投身C#/Java了
0 请登录后投票
   发表时间:2007-04-28  
用IDispatch比较麻烦,是因为静态类型语言一般不使用这个接口,而是直接使用静态接口,有了接口定义的话,做起来比较简单,手工转几个需要的接口也行,本来是很简单的事,问题的根本在于你不自己去做,而别人又不一定有兴趣。写一个IDispatch涉及到相关的一些包装类,数目不大清楚,但应该可以在一天内完成,目前真抽不出时间,五一期间看看吧。我只是不想同时做几个项目,最近也累得慌。

jcc7这个例子是使用D调用VBScript引擎,取巧的做法。。
0 请登录后投票
   发表时间:2007-04-28  
圈子共享里我上传了我修改过的core32,库编译出来了,activex里面的例子编译时有个错误我排除不了:
E:\core32\ax>build ie.d win32.lib -I..\core32 -LIBPATH=..\core32\win32 -cleanup
E:\core32\core32\win32\com\OAIDL.d: module win32.com.OAIDL is in multiple packages win32.com.OAIDL

有兴趣的接着做吧。。。
0 请登录后投票
   发表时间:2007-04-28  
OK了,大概是build或者是其它问题,我已经编译成功了ie.d,它可以成功启动IE浏览器。

E:\core32\activex>dmd ie.d -I..\core32 activex.d ..\core32\win32\win32.lib
e:\dmd\bin\..\..\dm\bin\link.exe ie+activex,,,..\core32\win32\win32.lib+user32+kernel32/noi;
0 请登录后投票
   发表时间:2007-04-28  
有些例子编译不过,比如scriptcontrol.d和core32_activex.d,我怀疑是DMD的BUG,提示的信息很奇怪。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics