|
질문 1: 안녕하세요. 저는 OO시스템의 심OO이라고 합니다 여러 VB 사이트를 돌아다녀 봐도 제가 원하는 FAQ는 없더군요.. 그러다 이곳을 들러보니 배울게 무척많아 참 좋았습니다. 그리고 질문해도 답변을 해주실것 같아서... 제가 지금처리하고자 하는 문제는 비주얼베이직 3.0으로 개발한 프로그램이 있습니다. 이 프로그램에서는 Spread2.0/VBX를 사용했구요... 그런데 이번에 VB 6.0으로 버전업하는관계로 바꾸려고 소스를 읽어들여보니까 황당무계하게도 Spread2.0/VBX가 모두 Picturebox로 바뀌어 버리더라구요. 화면이 무려 200개 가까이 되는데 전부 스프래드를 다시 그리려니 이건 완전 노가다 같아 질문 드립니다. 참고로 제 나름대로 생각해보고, VB 3.0을 VB 4.0 16 비트로 한번 버전업한 다음 다시 VB 5.0으로 버전업했습니다. VB 4.0에서는 모든게 정상적으로 되었습니다만 VB 5.0부터 픽처박스로 몽땅 바뀌어버립니다. 또, SSpannel을 사용했는데 버전업이 90%정도는 제대로 되는데, 몇개의 폼들은 SSpannel 를 제대로 변경하지 못하더군요... 그래도 이건 몇개 안되니까 다시 그리면 된다고 하지만 Spread는 화면이 200개입니다... 가능한 모든 방법을 알려주시면 감사하겠습니다. Spread는 폼에 그려져있습니다 따로 파일로 읽어들이는 것이 아님을 알려드립니다...
|
답변 1: VBX/OCX 해킹 이태희입니다. 저도 VB 3.0 프로젝트를 VB 5.0으로 바꾸는 같은 경우를 만나게 된 적이 있는데, Spread 2.5/OCX버전을 설치하시면 안에 문서화되어 있는 자료가 있습니다. 파일명은 UPGRAD.TXT입니다. 심OO님의 경우는 Spread 2.5/OCX가 설치되지않아서 픽처박스로 바뀔수도 있고, 아니면 설치되어있어도 비주얼베이직에서 변경된 클래스를 인식하지못해서 자동 업그레이드를 못하는 경우도 있습니다. Spread 2.5로 업그레이드할때 아래의 리스트에서 맞는 경우를 고르시면 됩니다.
|
위의 경우는 비주얼베이직의 버전 문제가 아닌 Spread/OCX의 버전 문제였다. 비주얼베이직에선 하위버전 호환성을 위해서 소스를 컨버트하려고 읽어들이면 버전을 검사해 새 버전이 있으면 [그림 3]과 같은 커스텀 컨트롤 업그레이드 대화상자가 나타난다. CMDIALOG.VBX나 THREED.VBX같은 비주얼베이직의 기본 내장 컨트롤은 새 버전으로의 업그레이드가 충분히 고려되어있는것을 알 수 있다.
비주얼베이직 3.0으로 개발한 프로젝트는 비주얼베이직 6.0에서도 거기에 맞는 OCX 버전을 기본적으로 준비해두고 있기 때문에 별로 문제가 되지않지만, 문제가 되는 것은 상용으로 판매되고 있는 VSVBX.VBX, VSVIEW.VBX, SPREAD20.VBX이다. 이 컨트롤들은 비주얼베이직에 기본적으로 포함된 것이 아니기 때문에 업그레이드 버전을 필히 구매하여야 한다.
프로젝트를 업그레이드하기전에 vsOCX, vsView/OCX 버전을 설치해주면 VBX를 OCX 변경해줄 업그레이드 키도 같이 설치된다. Videosoft사의 VSVIEW.VBX, VSVBX.VBX는 상용 서드파티 컨트롤이라도 업그레이드 키가 있기 때문에 [그림 3]처럼 새로운 OCX버전인 VSVIEW3.OCX, VSOCX6.OCX로의 변환이 쉽게 이루어진다.
그러나, [그림 3]의 박스에서 SPREAD20.VBX는 앞의 vsOCX 경우와 다르게 업그레이드 키가 없어서 스프레드시트 컨트롤 인스탄스들이 픽처박스로 바뀌어 버리게 될 것이라고 경고하고 있다. 200개 가까이 되는 Spread 컨트롤이 모두 픽처박스로 바뀌어버린다. 분명 Spread 2.5/OCX 정품을 구매해서 설치했지만 Class 이름이 SpreadSheet에서 vaSpread로 변경되었기 때문에 일일이 고쳐주어야 하는 문제가 있다.
VB.INI라는 파일을 열어보면 다음과 같이 정의된 업그레이드키를 볼수 있다.
threed.vbx={0BA686C6-F7D3-101A-993E-0000C0EF6F5E}#1.0#0;C:\WINDOWS\SYSTEM\threed32.ocx
여러분이 PC 통신동호회에서 구한 소스가 A라는 상용 컨트롤을 사용하고 있을때, A 컨트롤이 설치되지않은 PC에서는 무조건 픽처박스로 바뀌게되는 것을 경험한 분도 있을 것이다. 그래도 질문하신 독자께선 조금 머리를 써서 비주얼베이직 3.0을 16-Bit 비주얼베이직 4.0로 중간 버전업 한다음 다시 비주얼베이직 5.0으로 버전업하는 아이디어를 썼다.
16 비트 비주얼베이직에선 VBX도 사용할수 있으므로 문제가 생기지 않지만 32 비트인 비주얼베이직에선 VBX를 쓸수없어 즉시 문제가 발생한다. 같이 사용되었던 SSpannel 컨트롤도 버전업이 90%정도는 제대로 되는데, 단지 몇개만 SSpannel을 제대로 변경하지 못하는 문제가 있었다. 그래도 이건 몇개 안되니까 다시 그리면 된다. 자동 업그레이드가 되지않는다면 Spread 컨트롤은 200개나 다시 그려야 하는 어려움에 처하게 된 것이다.
Spread/OCX 2.5 버전을 설치하면 버전업에 관해 문서화되어 있는 자료가 있다. 파일명은 UPGRAD.TXT이며, Spread/OCX 2.5로 업그레이드할때라도 여러가지 케이스가 생기므로 이 문서를 참조해서, 적당한 경우를 고르면 된다.
① Spread/VBX 2.1 버전을 2.5 버전으로 업그레이드하는 경우
비주얼베이직 프로젝트에서 단순히 Spread/VBX 2.1버전을 Spread/VBX 2.5 버전으로 VBX컨트롤만 업그레이드하는경우이다.
Spread/VBX에 대한 내장함수 선언문이 들어있는 VB_CONST.TXT라는 파일 대신 새로운 함수 선언문 파일인 SSVBX.BAS 파일을 추가해주고, 프로젝트파일(.MAK)에서
Change . . . To . . .
SPREAD20.VBX SSVBX25.VBX
으로 파일 이름을 변경해준다. Spread가 사용된 (.FRM) 파일을 텍스트에디터에서 열어 모든 스프레드 컨트롤 클래스이름을 다음처럼 바꾸어준다.
Change . . . To . . .
Spreadsheet vaSpread
참고로 비주얼베이직 3.0이 있다면 미리 프로젝트를 열어 각 폼을 텍스트형식 포맷로 저장해두면 컨버트에 도움이 된다. 비주얼베이직 3.0에선 텍스트 포맷으로 저장하는 .FRM과 바이너리 코드가 저장되는 .FRX라는 두 개의 저장파일이 있는데, 문제가 있는 SSpannel 파일은 .FRX라는 파일을 읽어들이지못해서 생기는 문제이다.
② Spread/VBX 버전을 Spread/OCX 2.5를 사용해 업그레이드하는 경우
함수선언문이 들어있는 VB_CONST.TXT 대신 SSOCX.BAS 파일을 추가하고, (.MAK)파일에서 다음처럼 바꾼다.
Change . . . To . . .
SPREAD20.VBX SSVBX25.VBX
Spread가 사용된 (.FRM) 파일을 텍스트에디터에서 열어 모든 스프레드 컨트롤 클래스이름을 다음처럼 바꾸고, 프로젝트를 다시 읽어들여서 재저장하면 자동으로 업그레이드가 되어 (.FRX)파일의 바이너리 데이터들이 갱신된다.
Change . . . To . . .
Spreadsheet vaSpread
그리고, EVENTS.TXT를 참조해서 이벤트 파라미터와 메소드의 변경사항을 검토해야한다. 다음처럼 변경된 사항이 있다.
Spread/VBX 2.0로 작성한 소스코드
bSuccess = SpreadAddCustomFunction (Spread1, "Cube", 1)
bValid = SpreadIsFormulaValid (Spread1, "a1+b1")
SpreadSetText (Spread1, Col, Row, "Text")
Spread/OCX로 작성한 소스코드
bSuccess = Spread1.AddCustomFunction ("Cube", 1)
bValid = Spread1.IsFormulaValid ("a1+b1")
Spread1.SetText Col, Row, "Text"
VERSION 5.00 Object = "{B02F3647-766B-11CE-AF28-C3A2FBE76A13}#2.5#0"; "SS32X25.OCX" Begin VB.Form Form1 Caption = "Form1" StartUpPosition = 3 'Windows Default Begin FPSpread.vaSpread vaSpread1 Height = 4095 Left = 120 OleObjectBlob = "frmFarpoint.frx":0000 Width = 5175 End End
|
③ C++ 프로젝트용 Spread/VBX++ 2.0을 2.5로 업그레이드하는 경우
프로젝트 파일에서 VBX 파일명의 교체를 한다.
Change . . . To . . .
SSPP20.VBX SSVBX25.VBX
기존의 VBX용 SSPP.H 헤더파일대신 새로운 SSVBX.H 파일로 교체한다. 리소스 파일(.RC)을 텍스트에디터에서 열어 다음처럼 변경해준다.
Change: CONTROL "SSPP20.VBX;Spreadsheet;
To: CONTROL "SSVBX25.VBX;vaSpread;
소스 파일(.CPP)에서 런타임 생성에 대한 코드도 수정한다.
Change: Create("SSPP20.VBX;Spreadsheet;" . . . )
To: Create("SSVBX25.VBX;vaSpread;" . . . )
라이브러리 필요한 소스
MFC SSVBXMFC.CPP
OWL SSVBXOWL.CPP
④ Farpoint GRID/VBX 1.0을 SpreadVBX 2.5로 업그레이드할 때
Farpoint에서 VBX버전으로 개발했던 FPGrid/VBX라는 제품이 있었다. Spread와 비슷한 제품이다. 함수선언문이 있는 FPGRID.BAS를 제거하고, 대신 SSVBX.BAS를 사용한다. 프로젝트를 재저장한뒤, (.MAK)파일에서 다음 라인처럼 바꾸어준다.
Change . . . To . . .
FPGRID10.VBX SSVBX25.VBX
(.FRM)파일에서 Grid클래스를 변경한다. ① 경우와 다르지않다.
Change . . . To . . .
SpreadSheet vaSpread
⑤ FPGRID/VBX 1.0을 Spread/OCX 2.5로 업그레이드할 때
함수선언문이 있는 FPGRID.BAS를 제거하고, 대신 SSOCX.BAS를 사용하고 텍스트에디터에서 (.MAK)파일을 다음처럼 바꾸어준다.
Change . . . To . . .
FPGRID10.VBX SSVBX25.VBX
(.FRM)파일에서 Grid 클래스를 변경한다. 프로젝트를 다시 읽어들여서 재저장하면 업그레이드가 되어 (.FRX)파일의 바이너리 데이터들이 갱신된다.
Change . . . To . . .
SpreadSheet vaSpread
EVENTS.TXT를 참조해서 이벤트 파라미터와 메소드의 변경사항도 검토해야한다.
Grid/VBX 2.0로 제작한 소스코드
ret = SaveTabFile (Grid1, "\Test.txt")
fpSetText (Grid1, Col, Row, "Text")
OCX로 제작한 소스코드
ret = Grid1.SaveTabFile("\Test.txt")
Grid1.SetText Col, Row, "Text"
Spread 2.5의 트라이얼 문제점
다른 독자가 의뢰하신 문제점을 보도록 하자. 비주얼베이직 프로그램을 짜다가, 기본 제공하는 Grid로는 해결할 수 없는 부분이 있어 Spread/OCX를 구입했는데, 윈도 NT에서 인스톨을 시작하면 에러가 발생한다고 한다. "GLBSSTUB 이(가) 0x040cf53c 의 (....) 에서 액세스를 위반했다"는 "데이터 액세스 위반" 메시지가 뜨지만 윈도 NT 이벤트 표시기에는 새로 추가된 에러메시지가 없다. 즉, Spread/OCX 2.5가 윈도 95에선 제대로 되는데, 윈도 NT에는 설치가 왜 안되는지 알고 싶다는 문의였다. 나름대로 FarPoint사에 문의해 유니코드와의 충돌이 일어날것이란 답변을 받았지만 레지스트리의 언어설정만 미국어로 바꾸는 응급처치법을 사용했다.
하지만 비주얼베이직을 띄워서 Spread 컨트롤을 폼에 갖다놓으면 License Agreement 타이틀과 컨트롤 버전 2.5.40 이라고 뜨고, 30 day Trial 이라고 이상하게 표시된다는 것이다.
분명 46만원짜리 정품이고, 씨디 케이스에 붙어있는 상품코드에는 SPR.02.05.35-xxxx로 되어 있으니 트라이얼이 아니었다. 그리고, 시스템의 미세한 에러까지 감지하는 닥터왓슨(Dr.Watson) 프로그램이 응용프로그램 오류가 생겼다고 메시지를 내보낸다.
< vb5.exe 예외 : 액세스 위반 0xc0000005 주소 0xd32d4d8c >
문제의 해결방법은 이 글을 쓰는 시점에서 Spread97.EX 또는 98년 10월 28일자이후의 패치버전을 Farpoint 사의 홈페이지에서 다운로드를 받는것이다.
Farpoint Spread/OCX 2.5 다운로드 사이트 http://www.fpoint.com/GuideTechUpdate.htm |
Spread/OCX 정식버전 사용자라도 96년도 96년 9월 이전에 구입하신분들은 이런 문제를 겪게 된다. 필자가 96년도 대학생때 개발프로젝트를 위해 신용카드로 Spread/OCX 2.5를 샀는데, 2년이 지난 시점인 98년 9월에 PC에 있던 Spread 2.5가 Out Of Date - Expired 에러를 일으키며, 갑자기 트라이얼로 동작하는 일이 비슷한 일이 생겼었다.
Farpoint에 문의하여 알아본결과 Spread97 패치버전이란게 있다는 걸 알게 되었다. 정식명칭은 98년 10월 28일자 패치 - Spread 2.5.050 버전인데, 정식사용자에게만 메일로 전송-배포된 버전이다. 겉보기에는 Spread/OCX 2.5랑 똑같지만 버그를 상당히 잡은 버전이었다. 필자는 학교가 아닌 회사에 입사하면서 메일주소를 바꾸었기 때문에 받아보지못했던 것이다.
회사를 자주 옮기는 사용자는 아무래도 웹메일을 개설하여 두는 것이 좋을듯싶다.
Spread 2.5.050을 설치하면 아무런 데이터액세스 위반 문제도 발생하지 않고 폼에 스프레드 컨트롤이 올라가게된다. 1998년 10월 28일에 출시된 Spread 2.5의 새 패치버전인 2.5.050은마이크로소프트사에서 구할수 있는 OLE Automation Update가 설치되어 있어야만 하며, 그렇지 않으면 레지스트리에 제대로 등록이 되지 않는다.