-- ¾Æ·¡´Â ¹ßÃéÇÑ ³»¿ëÀÔ´Ï´Ù. --
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¹øÀ» Á¦¿ÜÇÑ ³ª¸ÓÁö´Â ¼öÁ¤ µÈ °ÍÀ¸·Î º¸ÀÔ´Ï´Ù.
|
|