::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  신훈재(2003-03-20 02:39:15, Hit : 6864, Vote : 1205
 Win2k, Win Xp - Active X - Dax error : Access violation해결(IE상에서)

-- 아래는 발췌한 내용입니다. --

Delphi로 ActiveX 콘트롤이나 ActiveForm을 작성하면 IE상에서
DAX error : Access violation을 만들어 냅니다.

이 에러는 98에서는 발생하는 것을 본적이 없으며,
win2k에서는 아주 가끔, Win Xp에서는 빈번하게 발생합니다.

문제의 원인은 axctrls.pas의 ParkingWindow펑션에서 일어납니다.

소스 코드를 보시면 파킹윈도우를 만들기 위해서 registerclass를 하게 됩니다.
보통 윈도우 클래스는 윈도우를 처리하기 위한 프로시져를 가지는데요.
이게 처음 메모리에 로딩되는 ocx의 것을 사용하게 됩니다.

그런데 ie와 같이 프로세스는 하나이고 빈번하게 ocx가 로딩되고
언로드 되는 과정에서 등록한 클래스의 처리 루틴이 메모리에 로딩되고
다시 떨어질때 문제가 생기는 것으로 보입니다.

즉 2개 이상의 delphi ocx를 사용하는 경우에
ie상에서 새창에 ocx를 띄울 때

1번 ocx가 올라 갈때 는 문제가 없다가
2번 ocx가 올라 갈때 문제가 생깁니다. 이때 1번 ocx가 언로드 중이라면
2번 ocx는 클래스는 레지스트 된것으로 생각하고, 윈도우 proc을 1번
ocx것을 사용하게 되는데 1번 ocx는 메모리에서 언로드 된 상황이라
access violation을 일으키게 됩니다. (에러의 정확한 위치는 CreateWindowEx에서 생기게 됩니다.)

일반 어플리케이션에서는 보통 초기에 모든 ocx 로딩이 끝나고
실행에 들어가는 경우가 많으므로 문제점이 나타나지 않았고,
win xp에 경우는 작업의 스위칭? 문제인지 os의 문제인지
특별히 잘나타나게 됩니다.

문제의 해결책은 간단합니다. 각 ocx가 자신의 parkingwindow처리 class와
proc을 사용하면 됩니다. 다음 소스를 axctrls.pas에 반영하고
소스 컴파일후 lib에 넣어주시면 처리 됩니다.


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;

참고로 axctrls에는 3가지 정도의 문제 점이 있는데요.
1. dax error : accessvioaltion
2. active x의 스크롤시 화면 깨지는 문제점
3. activeForm에서 OnDestroy의 call안됨입니다.

delphi 6에서는 1번을 제외한 나머지는 수정 된 것으로 보입니다.





731   [COM/OLE] 떠있는 모든 Microsoft Internet Explorer 의 html 불러오기  김영대 2003/03/30 5861 1444
730   [윈도우즈 API] IE의 "즐겨찾기 구성" 화면 띄우기  김영대 2003/03/30 5818 1887
729   [윈도우즈 API] 데스크탑의 현재 커서위치의 타이틀명과 클래스명 구하기  김영대 2003/03/29 4491 1136
728   [윈도우즈 API] 떠있는 모든 Microsoft Internet Explorer 죽이기  김영대 2003/03/29 4705 1324
727   [시스템] 윈도우즈 전체의 마우스/키보드 입력 금지  김영대 2003/03/29 5344 1350
726   [네트웍/인터넷] 인터넷에 접속되어 있는지 검사하기  김영대 2003/03/29 5363 1307
725   [일반/컴포넌트] TMemo 스크롤 다운 시키기  김영대 2003/03/29 4772 1380
724   [윈도우즈 API] 전체 화면(Full Screen) 만들기  김영대 2003/03/29 5166 1330
723   [윈도우즈 API] "시작"->"프로그램" 메뉴에 폴더 추가하기  김영대 2003/03/29 4927 1263
722   [윈도우즈 API] 폼이 Minimized 되었을때 깜박이게 하기  김영대 2003/03/29 6241 1647
721   [일반/컴포넌트] ListBox에서 마우스 이동시 아이템을 힌트로 보여주기  김영대 2003/03/27 4188 1116
720   [시스템] DOS 명령어 실행하고 결과 받아오기  김영대 2003/03/27 5238 1286
719   [윈도우즈 API] 액티브 데스크탑에 웹 컨텐트가 표시중인지 알기  김영대 2003/03/27 4290 1195
718   [윈도우즈 API] 작업표시줄의 시계 감추기/보이기  김영대 2003/03/27 7294 1993
717   [일반/컴포넌트] 커서(Cursor)의 이미지 구하기  김영대 2003/03/27 4631 1287
716   [윈도우즈 API] 스크린 세이버 On/Off  김영대 2003/03/27 4090 1038
715   [윈도우즈 API] 휴지통 비우기  김영대 2003/03/27 5269 1315
714   [일반/컴포넌트] IE Toolbar 에 버튼 올리기  김영대 2003/03/26 12416 1216
713   [일반/컴포넌트] 기본 Popup Memu 띄우지 않기  김영대 2003/03/26 3801 1021
712   [윈도우즈 API] "임시 인터넷 파일" 전부 지우기  김영대 2003/03/26 5272 1256
711   [일반/컴포넌트] 설치된 모든 프로그램 읽어오기  김영대 2003/03/26 5669 1469
710   [데이터베이스] DBGrid 의 현재 커서의 행/열 구하기  김영대 2003/03/26 5258 1275
709   [일반/컴포넌트] INF 파일 설치하기  김영대 2003/03/26 5224 1295
708   [데이터베이스] BDE Alias 없이 Database 동적으로 연결하기  신훈재 2003/03/24 12765 1131
  [COM/OLE] Win2k, Win Xp - Active X - Dax error : Access violation해결(IE상에서)  신훈재 2003/03/20 6864 1205
706   [데이터베이스] ORA-12571: TNS:packet writer failure  김영대 2003/03/19 9638 1374
705   [데이터베이스] DBGrid 의 모든 Row 를 Select 시키기(SelectAll)  김영대 2003/03/18 4413 1047
704   [데이터베이스] index file의 갯수와 성능 문제  김영대 2003/03/17 5294 1377
703   [일반/컴포넌트] ListView에 확장자별 아이콘 넣기  신훈재 2003/03/15 6734 1147
702   [일반/컴포넌트] ScrollBox 에 배경그림 넣기  김영대 2003/03/14 4004 1089
701   [시스템] '응답없음' 프로세서를 감지하는 잼나는 방법  구창민 2003/03/14 10220 1312
700   [윈도우즈 API] 입력을 기다리는 풀스크린 콘솔 윈도우 만들어 보기  구창민 2003/03/14 6506 1125
699   [일반/컴포넌트] 특정 레지스트리 키 의 모든 목록을 한방에! 읽어오기  구창민 2003/03/14 5101 972
698   [일반/컴포넌트] 트레이 아이콘에 풍선 힌트 보여주기  구창민 2003/03/14 6815 1314
697   [윈도우즈 API] 외부 프로그램의 상태표시줄의 Text 가져오기  구창민 2003/03/14 5739 1302
696   [시스템] IP Address 윈도우 폼위에 만들어보기  구창민 2003/03/14 5532 1266
695   [시스템] 특정 DLL 의 함수목록을 구해보자.  구창민 2003/03/14 5615 1184
694   [시스템] 쓰레드 내에서 폼을 생성해보자  구창민 2003/03/14 5712 1189
693   [윈도우즈 API] 외부 프로그램 모달 창처럼 띄워서 종료될때 기다리기(시점 알기)  구창민 2003/03/14 5582 1243
692   [일반/컴포넌트] 컴포넌트에 오픈다이얼로그를 띄우는 속성 만드는 방법  구창민 2003/03/14 3993 1011

[1][2][3][4][5][6] 7 [8][9][10]..[25] [다음 10개]
 

Copyright 1999-2023 Zeroboard / skin by zero