솔루션 : 1. 설치 프로그램을 사용하여 패키지 파일을 사용하면 시스템 자체가 다시 설치되면 프로그램 자체를 사용하여 기능을 작성해야합니다.
그것을 사용하는 두 가지 방법이 있습니다.
1. 시각적 ActiveX 컨트롤을 프로그램에 직접 배치하십시오.
2. 런타임은 필요에 따라 실시간으로 설정됩니다.
직접 사용되면 응용 프로그램은 컨트롤이 등록되지 않은 경우 필요한 ActiveX 컨트롤을 자동으로 검색하고 생성합니다.
프로그램 양식에 새 방법을 추가하십시오.
단위 uautoregactivex;
인터페이스
용도
Windows, 메시지, sysutils, 변형, 클래스, 그래픽, 컨트롤, 양식, 대화, comobj;
유형
tautoregactivexfrm = class (tform)
프로 시저 Formcreate (sender : tobject);
사적인
{개인 선언}
공공의
{공개 선언}
보호
{공개 선언}
절차 checkexception (발신자 : Tobject; Eabort : Exception);
끝;
var
AutoreGactivexfrm : tautoregactivexfrm;
구현
{$ r *.dfm}
{---------------------------------------------------------
Standard ActiveX 컨트롤에는 DllRegisterserver와 Dllunregisterserver가 호출 할 수있는 두 가지 기능이 있으며, 여기서 기능은 제어를 등록하고 컨트롤을 제거하는 데 사용됩니다. LoadLibrary를 사용하여 DLL/OCX 파일을로드하고 GetProcadDress를 사용하여 DllRegistersErver 및 DllUnRegisterServer에 포인터를 가져온 다음이 두 기능을 직접 실행하여 ActiveX 컨트롤을 등록하고 설치하지 않도록 Windows System의 RegSVR32를 교체합니다. 컨트롤을 등록하고 제거하십시오.
--------------------------------------------------------- }
{---------------------------------------------------------
매개 변수 설명 :
Solefilename DLL 또는 OCX 파일 이름;
OleAction은 등록 작업 유형을 나타냅니다. 1 등록을 표시하고 0은 제거를 나타냅니다.
반환 값 : True는 작업이 성공적으로 실행되었음을 의미하며, False는 작업이 실패했음을 의미합니다.
--------------------------------------------------------- }
함수 oleregister (solefilename : String; oleact : byte) : boolean;
Const
레지스터 = 1; // 레지스터
UNGESTEROLE = 0;
유형
TolereGisterFunction = 기능 : HRESULT; 등록 또는 기능 프로토 타입
var
hlibraryhandle : thandle; // dll 또는 ocx 핸들
hfunctionaddress : tfarproc; // getProaddress에 의해 반환 된 기능 핸들
regfunction : toleregisterfunction; // 기능 포인터 등록 또는 제거
시작하다
결과 : = 거짓;
// 파일을 열고 DLL 또는 OCX 핸들을 반환합니다.
hlibraryhandle : = loadlibrary (pchar (solefilename));
if (hlibraryHandle> 0) 그러면 // dllakg ocx 핸들이 맞습니다.
노력하다
// 등록으로 돌아 가거나 함수 포인터를 제거합니다
if (OleAction = RegisterOle) 그런 다음 // 등록 된 기능 포인터를 반환합니다.
hfunctionAddress : = getProcadDress (hlibraryhandle, pchar ( ''dllregistersserver ''))
else // 제거 기능 포인터를 반환합니다
hfunctionAddress : = getProcadDress (hlibraryHandle, pchar ( ''dllunregistersServer '');
if (hfunctionAddress <> nil) 그런 다음 // 등록 또는 제거 기능이 존재하는지 판단합니다.
시작하다
regfunction : = toleregisterfunction (hfunctionAddress);
regfunction> = 0이면 // 등록 또는 제거 작업을 실행하면 반환 값> = 0은 실행이 성공했음을 의미합니다.
/tresult : = true;
끝;
마지막으로
Freelibrary (HlibraryHandle); // 열린 파일을 닫습니다
끝;
끝;
{tautoregactivexfrm}
절차 tautoregactivexfrm.checkexception (발신자 : Tobject;
Eabort : 예외);
시작하다
eabort가 ealsyserror라면 그렇다면
시작하다
hresult (eoloSySerror (eaBort) .ErrorCode) = regdb_e_classnotreg
oleregister ( ''d : /flash.ocx '', 1);
끝
또 다른
application.showexception (eabort);
끝;
// 메인 양식의 onCreate 이벤트에서 시스템 애플리케이션 변수에 checkexception 메소드를 할당합니다.
절차 tautoregactivexfrm.formcreate (sender : tobject);
var
Demoocx : 변형 ;/ 변수 선언
시작하다
Application.Onexception : = Checkexception;
// 클래스 이름 문자열 오류가 생성됩니까?
노력하다
demoocx : = createoleObject ( ''demo.demo '');
제외하고
eabort : eolesyserror do
hresult (eabort.errorcode) = co_e_classsstring이면
시작하다
oleregister ( ''d : /flash.ocx '', 1) 인 경우
/tdemoocx : = createoleObject ( ''demo.demo '')
또 다른
시작하다
/tapplication.messagebox('Control Registration 실패, 프로그램은 정상적으로 실행되지 않습니다.
/tapplication.terminate;
끝;
끝;
끝;
끝;
끝.