제공된 .ocx 을 기반으로 비 시각적 ActiveX 컨트롤을 테스트하고 제공되는 마법사를 사용하여 Delphi로 가져옵니다.이전 델파이 버전의 ActiveX 컨트롤
그런 다음 생성 된 구성 요소를 새 VCL 응용 프로그램의 기본 폼에 넣기 만하면됩니다.
이전 델파이 버전 (D5 및 D2007)에서는 응용 프로그램을 시작할 때 구성 요소 초기화 중에 AV 가 발생합니다.
(Delphi 2009 사용) : 문제가 없으면 응용 프로그램이 부드럽게 시작됩니다.
내 질문은 : 액티브 관리의 알려진 향상 이 차이를 설명 할 수있는 최근의 델파이 버전
이 있습니까?
ActiveX 컨트롤의 버그가 의심 스러우 나, 문제의 원인을 이전 Delphi 버전에서 비롯된 것으로 간주 할 수 있습니까?
D2007에서이 구성 요소를 사용할 필요가 있습니다 (테스트가 정상이면). D2007에서 생성 된 .tlb 파일을 수정하여 D2007에서 AV 문제를 해결할 수 있다고 생각하십니까? (예 : D2009 생성 된 D2009를 사용하려고 시도)
PS : ActiveX 컨트롤 이름이 지정되지 않았습니다. 질문은 특정 ActiveX 컨트롤이 아니라 Delphi 및 ActiveX에 대한 일반적인 질문입니다.
편집 : D2007으로
오류 (액세스 위반)가 Application.CreateForm (된 TForm1, Form1에) 동안 나타납니다;
및 더 구체적으로 Olecontrol가 생성 될 때 :
procedure TOleControl.CreateInstance;
var
ClassFactory2: IClassFactory2;
LicKeyStr: WideString;
procedure LicenseCheck(Status: HResult; const Ident: string);
begin
if Status = CLASS_E_NOTLICENSED then
raise EOleError.CreateFmt(Ident, [ClassName]);
OleCheck(Status);
end;
begin
if not (csDesigning in ComponentState) and
(FControlData^.LicenseKey <> nil) then
begin
// ON THE LINE BELOW : the call of CoGetClassObject raise an AV
OleCheck(CoGetClassObject(FControlData^.ClassID, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, nil, IClassFactory2, ClassFactory2));
LicKeyStr := PWideChar(FControlData^.LicenseKey);
LicenseCheck(ClassFactory2.CreateInstanceLic(nil, nil, IOleObject,
LicKeyStr, FOleObject), SInvalidLicense);
end else
LicenseCheck(CoCreateInstance(FControlData^.ClassID, nil,
CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IOleObject,
FOleObject), SNotLicensed);
end;
오류를 알려 주시면 도움이 될 수 있습니다. – Leo
@Mef : 오류에 대한 추가 정보가 추가되었습니다. D2009 TOleControl.CreateInstance (OleCtrls.pas에서)가 정확히 동일한 함수이지만 CoGetClassObject를 호출해도 AV가 발생하지 않는다는 것은 이상합니다. – DamienD