谁装了Visual Studio 6.0,请进来!300分(50分)

  • 主题发起人 主题发起人 一个过客
  • 开始时间 开始时间
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;


然後可以通過RUN->Register ActiveX Server來把你的ActiveX Control註冊的,
你可以通過CreateComObject來建立ActiveX Control的GUI註冊問題.
 
上帝啊!!!怎么净是些不看清题意就回答问题的人啊!
我真是受不了了!!!
 
直接放到网页上看效果倒是简单,DELOY一下
 
>>直接放到网页上看效果倒是简单,DELOY一下

是啊是啊!我曾经设想过,创建一个TWebBrowser,然后把注册后的ocx放在上面,
这样的话调入GUI的工作就不用操心了,可是这样一来实现交互似乎比较麻烦,比如
调用这个ocx的方法,而且更重要的是,ocx的事件怎样处理?

最好还是能够用程序来调入ocx的GUI,比如调入一个ActiveXForm。
 
我也是DELOY到網頁上調試的, 下面是從我的程式中給一段拿IE HANDLE的CODE.

function TCYBERBand.SetSite(const pUnkSite: IUnknown):HResult;stdcall;
var
pOleWindow:IOleWindow;
pOLEcmd:IOleCommandTarget;
pSP:IServiceProvider;
rc:TRect;
begin
if Assigned(pUnkSite) then begin
m_hwndParent := 0;
m_pSite := pUnkSite as IInputObjectSite;
pOleWindow := PunkSIte as IOleWindow;
//Àò±o¤÷µ¡¤fIE­±ªOµ¡¤fªºHandle
pOleWindow.GetWindow(m_hwndParent);
if(m_hwndParent=0) then begin
Result := E_FAIL;
Exit;
end;
//Àò±o¤÷µ¡¤f°Ï°ì
GetClientRect(m_hwndParent, rc);
if not Assigned(frmIE) then begin
//«Ø¥ßTIEFormµ¡¤f¡A¤÷µ¡¤f¬°m_hwndParent
frmIE := TForm1.CreateParented(m_hwndParent);
m_Hwnd := frmIE.Handle;
SetWindowLong(frmIE.Handle, GWL_STYLE, GetWindowLong(frmIE.Handle,
GWL_STYLE) Or WS_CHILD);
//®ÚÕu¤÷µ¡¤f°Ï°ì³]¸mµ¡¤f¦ì¸m
with frmIE do begin
Left :=rc.Left
Top :=rc.top;
Width := rc.Right - rc.Left;
Height := rc.Bottom - rc.Top;
end;
frmIE.Visible := True;
//Àò±oÉOÂsÄý¾¹¬ÛÃöÁpªºWebbrowser¹ï¶H¡C
pOLEcmd := pUnkSite as IOleCommandTarget;
pSP := pOLEcmd as IServiceProvider;
if Assigned(pSP) then begin
pSP.QueryService(IWebbrowserApp, IWebbrowser2, frmIE.IEThis);
end;
end;
end;
Result := S_OK;
end;
 
这一段代码主要完成什么功能? 拿到IE的handle可以干什么呢?
 
然後把你的ActiveX Form繼承IE窗口區域, 然後就可以調試囉.
 
>>然後把你的ActiveX Form繼承IE窗口區域, 然後就可以調試囉.

能说的详细点吗?谢谢!!
 
我前面不是說過了嗎, 通過DllRegisterServer把ActiveX註冊, 然後用上面的代碼把ActiveX
繼承IE窗口, 這樣ActiveX的父親就是IE, 所以在這個基礎上再建立一個ActiveX From就可以
在WebBrowser上調試你的ActiveX Control了, 不過有個地方不好的就是, 每次修改程式都要
把ActiveX Control註冊一下才可以在WebBrowser上調試.
 
还是没看懂,一步一步来:
>>通過DllRegisterServer把ActiveX註冊
这个知道了

>>然後用上面的代碼把ActiveX繼承IE窗口, 這樣ActiveX的父親就是IE
您代码里面的frmIE是个什么东西?frmIE.IEThis又是什么东西?您这里所谓
的[red]继承[/red]是不是就是作为子窗口,而不是我们编程上所说的类的“继承”吧?

>>所以在這個基礎上再建立一個ActiveX From就可以
在这个基础上?怎么个在这个基础上? ActiveXForm和您说的ActiveX有什么关系?

能否把你的方法的原理给我讲一讲? 我模模糊糊感觉你的思路是:
1、我创建的ocx里面有2个activex,一个是activex,另一个是activex Form;
2、注册;
3、在IE里面创建实例的时候,也就是<OBJECT ...>,其中的activex动态的创建了一个
窗口frmIE,并且把frmIE的父窗口设为所在的IE窗口,并且尺寸也设置成一样大小??
4、然后把activex form调出来,放在frmIE上面??

我不明白的是:
1、如何“然后把activex form调出来”,即便调出来,如何使用它的事件?
也就是您上文说的“這個基礎上再建立一個ActiveX From就可以”?

别骂我笨哈,您说得太笼统了,就这些还是我猜测出来的,望不吝赐教!
 
再看了一遍,是不是frmIE就是那个ActiveXForm ??
 
TO 一个过客:
你真是厲害, 基本思路是正確的, frmIE就是一個TForm來的, 所有的事件都在這個Form上
實現的, 我寫這個程式的時候是我BOSS問我能不能在WebBrowser上把簡體字換成繁體字,
我才寫了這個COM, 我現在想增加這個ActiveX的功能, 就是用Mouse在Browser上可以翻譯
英文單詞, 但我還沒有能掌握屏慕抓詞在Browser裡面的實現.
 
如果frmIE只是一个普通form,不是那个ActiveXForm,那么我反而不明白了 :-(
这个Form和ActiveForm有什么关系呢?到底怎样“调入”activeForm我还是没明白。

>>所有的事件都在這個Form上實現的
问题是我要外界能够实现activeForm的事件,也就是说,当我在程序里面动态载入
了这个activeForm之后,我可以定义类似:
myactiveForm.OnMyEvent:=myEvent;
的语句,然后可以响应事件(当然,我保证这样的事件肯定存在)。如果你在Form
上实现事件,我就有点不明白了。

不过你的这种思路我觉得很新颖,很好。就是不知到是否适应我的要求。如果按照我
理解的思路,frmIE就是那个ActiveForm,有没有可能实现?也就是在ActiveX里面
动态用Create语句创建一个ActiveForm出来?
 
嗯, 這個frmIE只是一個普通的TForm, 不過我通過SetSite來Assign這個frmIE來建立TIEForm,
不過你用ActiveX Form來建立都可以的, 只不過我是用ActiveX的TypeLibrary來構造, 然後自
己建立一個跟ActiveX Form一樣的窗體而已, 需然我沒有直接用ActiveX Form, 其實原理是一
樣的. 所以按照這個思路你一樣可以實現的.
然而你所說的myactiveForm.OnMyEvent:=myEvent;這樣的Method定義本來就在構造窗口的時候
已經Declare了.
 
先这样吧!有问题再请教。多谢了。
 

Similar threads

D
回复
0
查看
744
DelphiTeacher的专栏
D
D
回复
0
查看
718
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部