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

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


Category

  신훈재(2003-03-20 02:39:15, Hit : 6742, Vote : 1175
 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번을 제외한 나머지는 수정 된 것으로 보입니다.





291   [네트웍/인터넷] Read/Write to COM Port  김영대 2003/03/07 4961 1174
290   [일반/컴포넌트] ListBox의 화면에 보여지는 최상위 Item 번호  김영대 2003/03/07 4301 1174
289   [일반/컴포넌트] MS-OutLook 으로 메시지 보내기  김영대 2003/03/07 4671 1174
288   [일반/컴포넌트] 문자열의 끝에서부터 검색하는 Pos() 함수  김영대 2003/03/07 5082 1174
287   [일반/컴포넌트] 쓰레드를 이용한 복수 Query 동시에 열기  김영대 2003/03/05 4727 1174
286   [데이터베이스] Query.RecordCount = -1  김영대 2003/03/07 4993 1173
285   [일반/컴포넌트] Memo의 입력행수 제한하기  김영대 2003/03/07 4115 1172
284   [윈도우즈 API] bitmap 인쇄하기  김영대 2003/03/05 4515 1172
283   [일반/컴포넌트] TStringGrid 인쇄하기  김영대 2003/03/07 4771 1170
282   [일반/컴포넌트] StringGrid 의 BeginUpdate/EndUpdate ?  김영대 2003/03/07 5438 1170
281   [데이터베이스] 몇가지 BDE 환경정보 구하기  김영대 2003/03/07 4353 1169
280   [일반/컴포넌트] TRichEdit 에 윗첨자, 아랫첨자 만들기  김영대 2003/03/07 4518 1169
279   [COM/OLE] How to register an OCX  김영대 2003/03/06 4971 1169
278   [일반/컴포넌트] 하나의 프로시저,함수로 다른 함수,프로시저를 처리  김영대 2003/03/05 3997 1169
277   [윈도우즈 API] 바로 직전에 active 되었던 윈도우와 콘트롤 구하기  김영대 2004/07/24 4614 1168
276   [시스템] 쓰레드 내에서 폼을 생성해보자  구창민 2003/03/14 5534 1168
275     [COM/OLE] [re] PDF ActiveX 사용하기  초보델피 2005/07/18 5251 1166
274   [윈도우즈 API] Hotkey를 이용하여 다른 프로그램에 글자 쓰기  김영대 2003/03/07 4223 1166
273   [일반/컴포넌트] ComboBox에 IE의 URL 입력창 같은 근접검색 두기  김영대 2003/03/31 4609 1163
272   [일반/컴포넌트] 수직 스크롤이 맨마지막으로 이동했는지 검사  김영대 2003/03/07 3934 1162
271   [윈도우즈 API] 데스크탑 아이콘 전부 감추기/보이기  김영대 2003/03/07 3934 1162
270   [일반/컴포넌트] 표준 콘트롤의 몇가지 한계  김영대 2003/03/05 4304 1161
269   [시스템] PC에 설치된 드라이브 목록 구하기  김영대 2003/03/07 4711 1160
268   [데이터베이스] Paradox 테이블이 깨졌을때...  김영대 2003/03/05 5020 1160
267   [윈도우즈 API] "문서" 메뉴에 파일을 등록하고 삭제하기  김영대 2003/03/05 4298 1159
266   [일반/컴포넌트] Memo의 커서를 특정 위치로 보낸후 scroll 시키기  김영대 2003/03/05 4951 1159
265   [일반/컴포넌트] 프로그램 종료시 도움말 화면 닫기  김영대 2003/03/05 4208 1159
264   [시스템] 일정시간 경과 후 윈도우즈 종료하기  김영대 2004/08/03 4673 1158
263   [알고리즘] 숫자를 KB, MB, GB 단위로 환산하기  김영대 2003/11/13 5001 1158
262   [시스템] 프린터에 escape 코드를 전달하는 방법  김영대 2003/03/06 3910 1158
261   [일반/컴포넌트] Variant 변수의 Type 알아내기  김영대 2003/03/05 4339 1157
260   [일반/컴포넌트] 파일에서 특정 Byte 모두 찾기  김영대 2003/03/07 4504 1156
259   [일반/컴포넌트] Button의 Mouse Down/Up 흉내내기  김영대 2003/03/07 4442 1155
258   [데이터베이스] SQL실행시의 모래시계를 표시하지 않는 방법  김영대 2003/03/07 4645 1154
257   [윈도우즈 API] IE의 현재 url 가져오기  김영대 2003/03/07 4587 1154
256   [일반/컴포넌트] 부활절 달걀(easter egg) 문자열 입력받기  김영대 2003/03/07 4773 1153
255   [시스템] Thread 사용하기  김영대 2003/03/07 4199 1153
254   [시스템] 화면보호기가 설치되어 있는지 검사하기  김영대 2003/03/07 3964 1153
253   [일반/컴포넌트] 표준 TListBox 에 Radio 버튼 올리기  김영대 2004/07/27 4183 1152
252   [일반/컴포넌트] 윈도우즈"시작" 버튼위에 글씨 쓰기  김영대 2004/07/24 4179 1151

[이전 10개] [1]..[11][12][13][14][15][16][17] 18 [19][20]..[25] [다음 10개]
 

Copyright 1999-2021 Zeroboard / skin by zero