为什么我在dll中用THashedStringList时就出错?整个程序退出?
如果去掉THashedStringList使用就可以运行

解决方案 »

  1.   

    貼出使用HASH的地方的代碼出來。
      

  2.   

    function IsExist(wnd:HWND;ht:HWNDType):Boolean;stdcall;
    begin
      if ht = htWeb then
        Result := WebHash.IndexOf(IntToStr(wnd)) <> -1
      else
        Result := IECWndHash.IndexOf(IntToStr(wnd)) <> -1;  
        Result := True;
    end;
    function CallWndProcHookCallback(code:Integer;wparam:WPARAM;lparam:LPARAM):LRESULT stdcall;
    var
      Cwp:TCWPSTRUCT;
      DstWnd:HWND;
      CopyDS:COPYDATASTRUCT;
      IsSend:Boolean;
    begin
      IsSend := False;
      if code >= 0 then
      begin
        Cwp := TCWPSTRUCT(PCWPSTRUCT(lparam)^);
        case Cwp.message of
          WM_KILLFOCUS,WM_SETFOCUS,WM_WINDOWPOSCHANGED,WM_DESTROY:
          if IsExist(Cwp.hwnd,htIEC) then //如果有写这句一运行就退出delphi,如果去掉就可以运行
            SendMessage(DestWnd,Cwp.message,0,0);
        end;
      end; 
      

  3.   

    WebHash,IECWndHash 什麼時候建立的?
      

  4.   

    dll最好不用用string类型。比如:

      if ht = htWeb then 
        Result := WebHash.IndexOf(IntToStr(wnd)) <> -1 
      else 
        Result := IECWndHash.IndexOf(IntToStr(wnd)) <> -1;  
        Result := True; 
      

  5.   


    在安装hook时创建的
    if HInstance = 0 then
      begin
        Result := False;
        Exit;
      end;
      FLock := TCriticalSection.Create;
      WebHash := THashedStringList.Create;
      IECWndHash := THashedStringList.Create;
      DestWnd := Wnd;
      hookCallWndProc := SetWindowsHookEx(WH_CALLWNDPROC,@CallWndProcHookCallback,HInstance,threadID);
      Result := hookCallWndProc <> 0;
      

  6.   

    问题应该不是出在是否使用的是THashedStringList,换用TStringList估计也会有问题。比较大的可能是存在多线程访问共享资源的时候产生冲突。关键点在于什么时候修改StringList,是否没有加以保护。报错的时候,具体报的又是什么样子的错误信息?