Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7829002
  • 博文数量: 92
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 5216
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-15 17:17
文章分类

全部博文(92)

文章存档

2011年(1)

2008年(91)

我的朋友

分类:

2008-08-28 11:57:12

近日,做一个在网页里面查看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.
阅读(2518) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~