[探索] -- 从 DLL 中导出可视控件( TWinControl ) ( 积分: 200 )

  • 主题发起人 主题发起人 田园的男孩
  • 开始时间 开始时间

田园的男孩

Unregistered / Unconfirmed
GUEST, unregistred user!
ActiveX 技术是一种好东西,但它通常要先注册,然后才能使用.本人不自量力,想尝试探索一种不需注册的 ActiveX 技术.当然,这种技术的基础是 DLL.

几经测试.我得出了两种实现方式,一种是从 DLL 中创建控件,再通过重置 ParentWindow( Edit1.ParentWindow := form1.handle) 的方法可以将该控件显露到 form1 上面,方法和事件则能用 interface 来实现.

可惜,这种方法在 delphi ide 调试出现一个问题,就是控件不能得到方向键和 Tab 键.
我查看 TForm 和 application 的源码,但是找不到原因.

第二种方法不谋而合的跟 VCL 的实现原理想到一起了.将 form1 上的任意一个 TWinControl 的 handle 传递给 DLL ,让 DLL 能通过 SetWindowLong 重置 该控件的 WinProc(消息处理指针)到 DLL 中,如此该控件的所有消息处理都跑 DLL 中去了,DLL 通过在后台处理该控件的所有消息,就能让该控件变成任意一个类型的控件.方法和事件则通过消息实现.

另外,可以象 COM 一样,让这类特殊的 DLL 拥有 GetEventCount GetEventName 等方法,如此就可以在不知道 DLL 中有什么控件和方法的情况下,读取信息并翻译成各种语言的声明脚本.


开这个帖子的目的是希望找到一种最好的实现方法,或者得到一点"技术补偿",希望各位高手不吝指教!
 
可惜 BPL 不能兼容 VB VC++...

目标基础一定要是 DLL
 
看一下.不太懂得.....
 
要替换dll中的Application.handle为应用程序的handle,Dll退出时在换回来。

“可以象 COM 一样,让这类特殊的 DLL 拥有 GetEventCount GetEventName 等方法”这样你还不如直接做成Com
 
Walnut_Tom 兄,application.handle 参与进去就只能支持 DELPHI,vb 和 vc 都用不了了.

我的目标是制作一个支持 各种语言的,能嵌入控件的,支持通过 接口 使用的 DLL
 
一般会有很多问题的,可以跟你说下
首先VCL有自己的消息处理,并不是完全遵循Windows的消息处理的。
if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
从这你可以发现,Delphi并不是简单的把消息直接传给目标窗体的,他会首先经过一系列处理,然后决定是否发给目标窗体。例如用dll封装的ListView中,上下按键就不管用了,无法移动所选的项目。
其次类似于Controls这种属性已经失效,意味着很多机制都不再有效(如事件通知)。
再次类似于TWinControl.UpdateControlState这种函数,他会判断顶级父对象是不是窗体(Control is TCustomForm),而此时is根本是无法使用的,会导致控件贴到窗体上了也无法自动刷新,甚至都不会创建Handle(VCL组件是在显示后才创建Handle的)
还有些其他的问题我就不说了。。。
 
谢谢 lake_cx 兄,你提起的部分问题我是知道的,我只是执着!呵呵
看来是不能完成了.结贴.

我再去试试看 Winproc 转移处理...
 
后退
顶部