创建的ActiveForm在IE中多次使用出现DAX ERROR: Access Violation的问题。
在2k和XP中。这个问题屡次出现,CSDN中对这个问题进行了多次讨论。很多人说在ActiveForm的Close事件中加入action := cafree;
但是ActiveForm没有Close事件:(Borland对此有证明回答:
Fix Delphi ActiveX DAX error : access violation using IE
http://codecentral.borland.com/codecentral/ccweb.exe/listing?id=18656但是,我还是想搞清楚action := cafree;的搞法,呵呵
特别是邀请nhdj(柳柳荷叶清清水)回答,100分相送:)

解决方案 »

  1.   

    在delphi5开发人员指南中有很明白的解释
      

  2.   

    nhdj惜字如金啊,呵呵,我现在就去下载。先谢过!
      

  3.   

    刚刚下载了这本书,从头翻到尾,没有对于ActiveForm的TCloseAction做任何说明,唯一涉及到TCloseAction的,是在TMDIChildForm的讲解中。    另外,TActiveForm的继承关系是:TActiveForm < TCustomActiveForm < TCustomForm < TScrollingWinControl < TWinControl < TComponent < TPersistent < TObject,
       
        没有看到他有FormClose的重载或者事件。    还是没有解决这个问题,nhdj希望你能不吝赐教。谢谢!
      

  4.   

    我也遇到了这个问题,希望nhdj能说的详细点
    或者delphi5开发人员指南中哪一部分有讲,我没找到。
      

  5.   

    to kuneo(KuNeo)
    按照http://codecentral.borland.com/codecentral/ccweb.exe/listing?id=18656
    上的说法,你的问题解决了吗?
    我的怎么不行?
    我用的是D7
      

  6.   

    To haze_cui() 
    问题解决了,你编译的.dcu需要放到<Program files>\Borland\Delphi7\Lib下,
    但是需要注意,Delphi默认配置,是取\lib\debug下的.dcu,你要把那个也替换一下。我认为Delphi 7不能不改这个明显的bug,可能还是我们的调用方法部队,
    所以非常想nhdj把他的方法讲清楚。呵呵,大家一起顶啊,我先顶两个。
      

  7.   

    to kuneo(KuNeo)
    我试过了,还是不行。能否借你的.pas和.duc过来用用? 我的mail  [email protected]我现在用的是一个空的form,新建的,什么都没加。
    运行顺序:先运行一个空的ie,再开两个我的ie,然后关掉第一次运行的我的ie,再运行一次我的ie,就会出错了。
    你的问题和我的一样吗?
      

  8.   

    我也遇到这个问题了,还不知道怎么解决,http://codecentral.borland.com/codecentral/ccweb.exe/listing?id=18656
    打不开了,请问大家用什么方法解决的?
      

  9.   

    我来综合回答大家问题吧!
    1、如果你是用d5 / d6开发的话,请参见http://codecentral.borland.com/codecentral/ccweb.exe/listing?id=18656axctrls.pasfunction 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;
    即修改axctrls.pas 文件,并重新编译
    2、在D7这样是不能解决问题的,而且Activeform也没有OnClose事件!但这样的问题一般都是出现在装了第三方IE Addin的机器上,只要你将 IE的 工具->选项->高级->浏览 里的"启用第三方扩展"勾 uncheck就可以了。
      

  10.   

    D7“取消第三方扩展”在有些情况下确实可以解决问题。
    反观种种现象,发现:如果是PackingWindow所造成的DAX Error,由于其出错原理,出错不会“百发百中”,但是多试几次就会出现。Borland论坛的问题应该可以奏效。若如果一个ActiveForm控件,在某些人的机器上,总是出现Dax Error而在其他的机器上总是不,很有可能不是PackingWindow的错。这时候,建议大家怀疑IE的插件。插件与你的Ax兼容性可能存在问题(我估计这一点atl的控件和dax控件一样)。诸位可以按照HorkyTao的方式关闭插件重试目前发现兼容性问题的插件有:
    1.  MSN Helper  (Faint, MS的东西)没问题的插件有:
    1.  Google ToolbarMSN Helper屡试不爽,建议有兴趣的兄弟找找兼容性问题的原因。结贴:分全给HorkyTao, 感谢他的深入研究。
      

  11.   

    难道只有放弃delphi才是唯一出路?