铁匠

做人要低调
随笔 - 133, 评论 - 255 , 引用 - 184

导航

公告

文章分类

存档

随笔分类

相册

BLOG

网站

论坛

Delphi开发ActiveX的时候要注意的一个问题

近日,做一个在网页里面查看Word,Excel,PPT的ActiveX控件,在自己的机器上运行,很顺利,可是发布出去后,老是报错.很郁闷.看了一下报错的画面是:DAX Error.查大富翁,知道了问题的起因:

Delphi 的 ActiveX一个进程只有一个 ParkingWindow,这就有一个问题,如果在一个程序里,应用了两个ActiveX控件,问题就来了,实际上,在大部分情况下,IE是一个进程,如果打开了多个ActiveX 控件页面,关闭其中一个,然后,再启动一个页面,就会出现 DAX Error

是Delphi的VCL的一个BUG,而且从D5开始就有了,一直到了D7都没修改.估计这和宝兰公司的人员不稳定有关吧,没有人做长期的维护.同时也得到了解决方案,把VCL里的axctrls.pas 的ParkingWindow函数进行修改:

function ParkingWindow: HWND;

var

TempClass: TWndClass;

ParkingName : String;

begin

Result := xParkingWindow;

if Result <> 0 then Exit;

// fix Dax error : accessviolation (win2k, win xp)

ParkingName := 'DAXParkingWindow_' + Format('%p', [@ParkingWindowProc]);

FillChar(TempClass, sizeof(TempClass), 0);

if not GetClassInfo(HInstance, PChar(ParkingName), TempClass) then // fix Dax error : accessviolation (win2k, win xp)

begin

TempClass.hInstance := HInstance;

TempClass.lpfnWndProc := @ParkingWindowProc;

TempClass.lpszClassName := PChar(ParkingName); // fix Dax error : accessviolation (win2k, win xp)

if Windows.RegisterClass(TempClass) = 0 then

raise EOutOfResources.Create(SWindowClass);

end;

xParkingWindow := CreateWindowEx(WS_EX_TOOLWINDOW, TempClass.lpszClassName, nil,

WS_POPUP, GetSystemMetrics(SM_CXSCREEN) div 2,

GetSystemMetrics(SM_CYSCREEN) div 2, 0, 0, 0, 0, HInstance, nil);

SetWindowPos(xParkingWindow, 0, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOREDRAW

or SWP_NOZORDER or SWP_SHOWWINDOW);

Result := xParkingWindow;

end;

我按它改了,可是还是一样的问题,以前只会报一下错,还可以使用,现在倒好,整个控件都挂了.最后,多看了几个帖子,发现这个也确实没有改好.最好找到一个方法,就是把原函数的if Result <> 0 then Exit; 去掉,重新编译,终于解决问题了.同时也发现在做WORD的时候,关必控件的时候,WORD终是不能释放, 通过多次的调试,发现要先把OleContainer里面的Object先释放,然后再关闭WORD.想想应该是Ole里面的那个Object是WORD的一个Adapter,要先关闭这个连接桥,这样WORD才没有其它的引用,这样才能够关闭WORD.

 

发表于 2006年4月20日 9:22

评论

# re: Delphi开发ActiveX的时候要注意的一个问题

我跟您的情况差不多也是用delphi做个ACTIVEX让ASP用

写好ActiveX后在网页里用 功能都实现了就是 一直不释放我写的Activex 记得以前在调试intraweb时出现类似的情况,不知您有没有好的方法 QQ:284375203

调用ActiveX控件时 系统自动运行dllhost.exe来加载我做的activex 然后dllhost进程就在也不结束了,注销也不行,必须重启
2006-10-10 11:03 | Scyclone

# re: Delphi开发ActiveX的时候要注意的一个问题

我跟您的情况差不多也是用delphi做个ACTIVEX让ASP用

写好ActiveX后在网页里用 功能都实现了就是 一直不释放我写的Activex 记得以前在调试intraweb时出现类似的情况,不知您有没有好的方法 QQ:284375203

调用ActiveX控件时 系统自动运行dllhost.exe来加载我做的activex 然后dllhost进程就在也不结束了,注销也不行,必须重启
2006-10-10 11:04 | Scyclone

# re: Delphi开发ActiveX的时候要注意的一个问题

哥们 你网页是不是有bug 怎么回复了一直显示 该页无法显示

弄的我回了那么多 郁闷
2006-10-10 11:39 | scyclone

# re: Delphi开发ActiveX的时候要注意的一个问题

如果你写的是服务器控件,那只有重启IIS后才能释放,这个是没有办法避开的.
如果是写WEB的OCX,那么只有关掉这个IE后才会释放,因为IE上再打开的页面,和原来的那个是同一个进程的,OCX是找到父进程后加载的,属于父进程,而不是属于那个窗体.
2006-10-11 10:02 | 铁匠

# re: Delphi开发ActiveX的时候要注意的一个问题

可能是服务器慢了些,刚才我把多的删了
2006-10-11 10:03 | 铁匠

# re: Delphi开发ActiveX的时候要注意的一个问题

把xParkingWindow改为ThreadVar变量就行了
2006-10-26 16:04 | newland9800

# re: Delphi开发ActiveX的时候要注意的一个问题

金格科技的产品iWebOffice(http://www.goldgrid.com)原来也有这个问题,现在已经解决了,是delphi的问题
2006-12-1 11:30 | dbstep

Post Comment

主题  
姓名  
主页
校验码  
内容   
京ICP备 05050892号