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

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


Category

  신훈재(2003-03-20 02:39:15, Hit : 6958, Vote : 1226
 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 5924 1447
730   [윈도우즈 API] IE의 "즐겨찾기 구성" 화면 띄우기  김영대 2003/03/30 5894 1891
729   [윈도우즈 API] 데스크탑의 현재 커서위치의 타이틀명과 클래스명 구하기  김영대 2003/03/29 4552 1140
728   [윈도우즈 API] 떠있는 모든 Microsoft Internet Explorer 죽이기  김영대 2003/03/29 4776 1349
727   [시스템] 윈도우즈 전체의 마우스/키보드 입력 금지  김영대 2003/03/29 5407 1357
726   [네트웍/인터넷] 인터넷에 접속되어 있는지 검사하기  김영대 2003/03/29 5414 1307
725   [일반/컴포넌트] TMemo 스크롤 다운 시키기  김영대 2003/03/29 4817 1384
724   [윈도우즈 API] 전체 화면(Full Screen) 만들기  김영대 2003/03/29 5213 1334
723   [윈도우즈 API] "시작"->"프로그램" 메뉴에 폴더 추가하기  김영대 2003/03/29 4984 1268
722   [윈도우즈 API] 폼이 Minimized 되었을때 깜박이게 하기  김영대 2003/03/29 6315 1657
721   [일반/컴포넌트] ListBox에서 마우스 이동시 아이템을 힌트로 보여주기  김영대 2003/03/27 4225 1118
720   [시스템] DOS 명령어 실행하고 결과 받아오기  김영대 2003/03/27 5328 1301
719   [윈도우즈 API] 액티브 데스크탑에 웹 컨텐트가 표시중인지 알기  김영대 2003/03/27 4360 1199
718   [윈도우즈 API] 작업표시줄의 시계 감추기/보이기  김영대 2003/03/27 7372 1999
717   [일반/컴포넌트] 커서(Cursor)의 이미지 구하기  김영대 2003/03/27 4672 1291
716   [윈도우즈 API] 스크린 세이버 On/Off  김영대 2003/03/27 4148 1043
715   [윈도우즈 API] 휴지통 비우기  김영대 2003/03/27 5348 1325
714   [일반/컴포넌트] IE Toolbar 에 버튼 올리기  김영대 2003/03/26 12464 1221
713   [일반/컴포넌트] 기본 Popup Memu 띄우지 않기  김영대 2003/03/26 3836 1022
712   [윈도우즈 API] "임시 인터넷 파일" 전부 지우기  김영대 2003/03/26 5323 1262
711   [일반/컴포넌트] 설치된 모든 프로그램 읽어오기  김영대 2003/03/26 5709 1482
710   [데이터베이스] DBGrid 의 현재 커서의 행/열 구하기  김영대 2003/03/26 5310 1280
709   [일반/컴포넌트] INF 파일 설치하기  김영대 2003/03/26 5269 1296
708   [데이터베이스] BDE Alias 없이 Database 동적으로 연결하기  신훈재 2003/03/24 12838 1141
  [COM/OLE] Win2k, Win Xp - Active X - Dax error : Access violation해결(IE상에서)  신훈재 2003/03/20 6958 1226
706   [데이터베이스] ORA-12571: TNS:packet writer failure  김영대 2003/03/19 9738 1378
705   [데이터베이스] DBGrid 의 모든 Row 를 Select 시키기(SelectAll)  김영대 2003/03/18 4457 1052
704   [데이터베이스] index file의 갯수와 성능 문제  김영대 2003/03/17 5341 1382
703   [일반/컴포넌트] ListView에 확장자별 아이콘 넣기  신훈재 2003/03/15 6883 1164
702   [일반/컴포넌트] ScrollBox 에 배경그림 넣기  김영대 2003/03/14 4065 1098
701   [시스템] '응답없음' 프로세서를 감지하는 잼나는 방법  구창민 2003/03/14 10413 1324
700   [윈도우즈 API] 입력을 기다리는 풀스크린 콘솔 윈도우 만들어 보기  구창민 2003/03/14 6580 1134
699   [일반/컴포넌트] 특정 레지스트리 키 의 모든 목록을 한방에! 읽어오기  구창민 2003/03/14 5169 973
698   [일반/컴포넌트] 트레이 아이콘에 풍선 힌트 보여주기  구창민 2003/03/14 7065 1340
697   [윈도우즈 API] 외부 프로그램의 상태표시줄의 Text 가져오기  구창민 2003/03/14 5944 1344
696   [시스템] IP Address 윈도우 폼위에 만들어보기  구창민 2003/03/14 5699 1274
695   [시스템] 특정 DLL 의 함수목록을 구해보자.  구창민 2003/03/14 5734 1200
694   [시스템] 쓰레드 내에서 폼을 생성해보자  구창민 2003/03/14 5860 1199
693   [윈도우즈 API] 외부 프로그램 모달 창처럼 띄워서 종료될때 기다리기(시점 알기)  구창민 2003/03/14 5685 1249
692   [일반/컴포넌트] 컴포넌트에 오픈다이얼로그를 띄우는 속성 만드는 방법  구창민 2003/03/14 4055 1018

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

Copyright 1999-2023 Zeroboard / skin by zero