'Programming Language/Delphi'에 해당되는 글 1건

[출처] http://www.wearethebest.co.kr/zbxe/?mid=CodeGear_Lecture_Capture&category=6065&document_srl=3752&sort_index=readed_count&order_type=desc

브라우저 빈창 하나띄우고(1번) Ctrl+N해서 새창 띄우고(2번) 2번창에 axtivexform이는 경로 페이지 로드하고
2번창에서 Ctrl+N해서 새창 띄우고(3번) 2번 창 닫고
3번창을 리로드하거나 3번창에서 새창을 띄우면
에러납니다.
여기에 있는 방법 말고도 Borland QC(3315)에 있는 해봤는데도
똑같네요

------------------------------------------------------------------------------------
[답변]DAXParkingWindow란 무엇인가여?  
Parking Windows는 델파이에서 ActiveX 컨트롤이나 ActiveForm을 사용시
컨트롤들을 구성,제어하기 위해 생성하는 윈도우 입니다.
AxCtrls.pas에 보시면 그 부분이 나와있는데요..
두가지 문제가 많이 발생한다고 합니다.

첫번째는 컨트롤 위에 컨트롤이 존재하는 형태일 경우 생성 순서의 문제에 의해
발생하는 경우로 소스단 에서 생성 순서대로 재배열 해주시는 방법이구요..
(이 부분은 직접 확인하지 않은...발취한 자료에 있는 내용 입니다.)

두번째는 예전 한델에서 발취한 부분입니다.
(http://www.delphi.co.kr/zboard/view.php?id=tips&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&keyword=dax&select_arrange=headnum&desc=asc&no=1328)

보시면 자세히 내용히 나와 있지만...간단히 풀어보면..
ActiveX나 ActiveForm을 생성하면 Parking Window를 하나 Windows에 등록(registerClass)을 하게 됩니다.
첫번째 OCX가 로드시 Parking Window를 등록하면 문제가 없지만 두번째가 로드시에
만약 첫번째가 언로드 중이라면 두번째 OCX는 이미 등록되어 있다고 판단하고 처리
루틴에 접근하면 Access violation 에러를 내게 됩니다.
위의 본문에도 나와있지만 해결책의 하나로서 자신만의 Parking Window를 사용하도록
수정하는 것이지요.
델6 까지 이 문제가 존재했던걸로 압니다.
델7에서는 ActiveForm을 건들지 않아 확인하지 못했습니다.


전대식 wrote:
> DAXParkingWindow란
>
> 어떤 윈도우를 말하는 것인가여?
>
> Activex를 제작중인데.. 다음과 같은 에러가 발생해서요.
>
>
> 1. Explorer 부모창에서 자식창을 띄웁니다.
>
> 2. 자식창에서 ActiveX 컨트롤이 있어서 구동됩니다.
>
> 3. 자식창에서 ActiveX를 종료하고 Destroy하는것까지 확인했습니다.
>
> 4. 자식창이 종료된 후에 부모창이 먹통이 되는 현상이 발생합니다.
>
> 에러 원인이 어떤건지 도대체 모르겠습니다.
> 부모창 자체에서 ActiveX를 테스트 해보면 아무 이상이 없는데..
> 팝업(자식창)에서 테스트해보면 이런 현상이 간혹 발생합니다.
>
> 이유를 모르니 답답하기만 합니다.
>
> 위와 같은 원인을 해결하신 분의 고견을 부탁드립니다.
>
> 그럼 수고하세요.



[답변]DAXParkingWindow란 무엇인가여?  
답변 정말 감사드립니다.

위의 방법으로도 수행을 했습니다.
지금 코드도 그렇게 생성이 되어 있구여.. 이젠 DAX Error는 발생하지 않는것 처럼
보입니다만

자식창이 종료된 후에 부모창이 먹통이 되는 현상이 발생합니다.

은 여전히 존재합니다.

이런 원인이 어떤건지 참 궁금합니다.

아시는분은 도움 부탁드립니다.

그럼 오늘도 즐프하세요.. ^^;;;


-------------------------------------------------------------------------------------------

[팁]ActiveX 제작시 DAX 에러가 발생하는 경우중 해결법 하나...  
안녕하신지요...

얼마전에 발견한것이었는데..지금 올립니다.

제가 해결한 방법일뿐이구요. 그래도 가끔은 해당되시는 분들이 계실듯해서...

한국 델파이 개발자 홈페이지에 가시면 팁란에 이광수님의 자세한 설명이 있구요...

지금 말씀드리는 것은 너무나 간단한거라서...

Visual Component 등을 ActiveForm 에 올려 놓으실때 간혹 개발과정중에 화면구성상

맨위로 올라와야 하는 컴포넌트가 그 밑에 깔리는 컴포넌트보다 먼저 생성이 되는 경우

가 있을 수 있습니다. 특히 소스 정리를 하다가도 그렇게 될수도 있구요...

이것을 제일 뒤(바닥)에 있는 것부터 생성하도록 다음부분에서 정리를 해주세요..


type
TMyActiveImgCtrl = class(TActiveForm, IMyActiveImgCtrl, IOleInPlaceActiveObject)
   Bevel1: TBevel;
   Label1: TLabel;
   Bevel2: TBevel;
   Label4: TLabel;
   Label5: TLabel;
   Label7: TLabel;
   CutImg: TImage32;
   OpenPictureDialog1: TOpenPictureDialog;
   Bitmap32List1: TBitmap32List;
   PreImg0: TImage32;
   ~~~~~~생략~~~~~


이부분의 컴포넌트들을 대충 순서대로 정리를 해 주었더니 에러가 사라졌다는...

제가 아직 초보인관계로 자세한 설명은 못하지만 액티브폼위의 비쥬얼컴포넌트들이

상속되는 순서에 있어서 자신의 Parent 가 있는데에도 그보다 먼저 생성되게 되면

에러가 나오는듯 하더군요.. 그냥 일반 어플리케이션에서는 별상관이 없고

ActiveX Form 에서만 그런듯 합니다. 허접한 팁이기는 해도 혹시나 하는 마음에 올립니

다..

즐겁게 코딩하세요...
    
--------------------------------------------------------------------------------


델마당 자료실엔 없길레
한국 델파이 개발자 모임에서 퍼왔습니다.
문제가 된다면 바로 삭제 조치 하겠습니다.
아직도 델7에서 여러 ActiveX를 맹글어 개발하는 관계로
DAX 에러때문에 고생을 많이 했는데 사용하여 보니 별 문제?!가 없더군요 -_-;

----------------------------------------------------------------------------
Delphi 7 VCL Bug-fix Pack

D7VCL.bpg를 열어서 전체 빌드하시면

Packing 디렉토리에 생기는 파일을 델파이 디렉토리에 복사하시면 끝입니다. ^^

1. axctrls.pas

1) access violation해결

2. 한영 전환 문제 해결책 적용

--------------------------------------

사용법을 잘모르시겠다는 메일이 와서 추가합니다.


delphi.co.kr에 자료실에 올린 파일을 받아서 압축을 풀고

D7VCL.bpg 파일을 델파이에서 엽니다.



메뉴에서



Project - Build All Project를 눌러서

전체 프로젝트를 컴파일 합니다.



압축을 푼 디렉토리에서 Packing  디렉토리에 보면 lib, Source 디렉토리가 보입니다.



이 2개 디렉토리를 전체를 선택해서 복사한후



델파이7 설치 디렉토리에 붙여 넣습니다.

(일반적으로 C:\Program File\Boralnd\Delphi7)



이런 후 다시 엑티브 엑스를 컴파일하시면 됩니다.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

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에 넣어주시면 처리 됩니다.


  1. function ParkingWindow: HWND;   
  2. var  
  3.   TempClass: TWndClass;   
  4.   ParkingName : String;   
  5. begin  
  6.   Result := xParkingWindow;   
  7.   if Result <> 0 then Exit;   
  8.   
  9.   // fix DAX error : accessviolation (win2k, win xp)   
  10.   ParkingName := 'DAXParkingWindow_' +   Format('%p', [@ParkingWindowProc]);   
  11.   
  12.   FillChar(TempClass, sizeof(TempClass), 0);   
  13.   if not GetClassInfo(HInstance, PChar(ParkingName), TempClass) then // fix DAX error : accessviolation (win2k, win xp)   
  14.   begin  
  15.     TempClass.hInstance := HInstance;   
  16.     TempClass.lpfnWndProc := @ParkingWindowProc;   
  17.     TempClass.lpszClassName := PChar(ParkingName); // fix DAX error : accessviolation (win2k, win xp)   
  18.     if Windows.RegisterClass(TempClass) = 0 then  
  19.       raise EOutOfResources.Create(SWindowClass);   
  20.   end;   
  21.   xParkingWindow := CreateWindowEx(WS_EX_TOOLWINDOW, TempClass.lpszClassName, nil,   
  22.      WS_POPUP, GetSystemMetrics(SM_CXSCREEN) div 2,   
  23.      GetSystemMetrics(SM_CYSCREEN) div 20000, HInstance, nil);   
  24.   SetWindowPos(xParkingWindow, 00000, SWP_NOACTIVATE or SWP_NOREDRAW   
  25.      or SWP_NOZORDER or SWP_SHOWWINDOW);   
  26.   Result := xParkingWindow;   
  27. end;  



참고로 axctrls에는 3가지 정도의 문제 점이 있는데요.

1. DAX error : accessvioaltion
2. active x의 스크롤시 화면 깨지는 문제점
3. activeForm에서 OnDestroy의 call안됨입니다.

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

from 마형

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

이전의 에러 해결 방법에 이어서 메인 쓰레드가 아닌 창에서
ActiveX 의 에러를 해결 한 방법을 소개합니다.

델파이 7 기준이며 이전 버젼도 적절히 고치면 사용이 가능합니다.

자료실에 업로드하겠습니다.

문제의 원인은 역시 파킹윈도우 인데요.

메인쓰레드에서 파킹 윈도우가 생성되면 문제가 없습니다만.
메인 윈도우가 아닌 gui 쓰레드에서 OCX가 로딩되고
다시 이 컨트롤이 이용되면

2번째 생긴 gui 쓰레드가 종료되면 3번째 gui의 컨트롤이 DAX에러를 일으 킵니다.

문제의 원인은 메인이 아닌 gui쓰레드에서 윈도우가 만들어 지면
정상적인 종료시에도 그 gui에서 생성된 모든 윈도우가 제거 됩니다.

따라서 2번째 3번째 스레드가 사용하던 파킹윈도우가 2번 쓰레드가 제거 되면 윈도우 자체가 파괴되고 이로 인해 3번째 쓰레드의 컨트롤이

에러를 만들어 내게 됩니다.

해결책은 각 쓰레드당 1개의 파킹 윈도우를 만들어 주면 되며, 이러한 방법을 통해서 제가 아는 한에 대해서는 일단 보여지는 에러는 없어지게 됩니다.

참고로 소스의 수정 부분은 bug-fix를 찾아보시면 되며, 한영 전환 문제에 대한 수정부분도 적용했습니다.

개인적으로는 이전에 한 약속을 지키게 되서 기쁘고, 이제는 에러없는 엑티브 엑스를 만들어 낼수 있어서 기쁘네요.

블로그 이미지

유효하지않음

,