2010-03-25 5 views
0

제공된 .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; 
+0

오류를 알려 주시면 도움이 될 수 있습니다. – Leo

+0

@Mef : 오류에 대한 추가 정보가 추가되었습니다. D2009 TOleControl.CreateInstance (OleCtrls.pas에서)가 정확히 동일한 함수이지만 CoGetClassObject를 호출해도 AV가 발생하지 않는다는 것은 이상합니다. – DamienD

답변

1

를 지금까지 내가 (유니 코드 지원 관련) 델파이 2009에서 액티브/TLB 수입에 큰 개선이 있었다 기억으로 - 그것을 설명 할 수 있습니다.

내 개인적인 경험으로 Delphi 7과 Delphi 2007에서는 반복적으로 일부 Windows 7 유형 라이브러리 (새로운 작업 표시 줄에서 작동하는 다양한 새 인터페이스)를 가져 오지 못했습니다. 그러나 Delphi 2009는 전혀 문제없이이를 관리했습니다.

이전 버전에서 Delphi 2009 생성 파일을 사용하는 경우 - 유니 코드 문제에주의하십시오. 또한 RTL에 결함이 있으면 도움이되지 않습니다 ... Delphi 2009에서 래퍼 ActiveX를 만들어 Delphi 2007에서 사용하십시오.

+0

귀하의 경험에 대한 의견을 보내 주셔서 감사합니다. D2009로 래퍼 빌드를 시도했지만 동일한 AV를 얻었습니다. 나는 내 프로젝트를 D2009로 옮길 것을 고려할 것입니다 ... 좋은 ActiveX 처리를하는 유일한 방법 인 것 같습니다. – DamienD

+0

또한 이전 델파이 버전의 ActiveX/tlb 관리가 불량/불완전한 것으로 인해 내 문제가 발생한다는 사실을 분명히 알 수 있습니다. – DamienD

0

전투 후 5 년 후 전투에 늦어서 죄송합니다. 그러나이 정확한 문제에 너무 많은 시간을 낭비하여 본 적이 있거나 내가 무엇을했는지 공유해야한다고 생각했습니다. 59 문자로 구성된 키가 들어있는 동일한 .lic 파일로 동일한 머신 (win7 64/win 8.1), 동일한 델파이 7 (동일한 버전의 빌드), 동일한 activeX (MapX 이름).

uQnZi2sFw22L0-MRa8pYX-1E2P8065-5N5M3459-3C934220-04969-6562 

동일한 수입으로 2 개의 약간 다른 TLB가 생성됩니다.

하나의 작업 : (win 8.1에서)이 작업은 TMap 프로 시저에 포함되어 있습니다.InitControlData :

작동하지

uQnZi2sFw22L0-MRa8pYX-1E2P8065-5N5M3459-3C93422P0-M04969-6562 

TLB (7 64 승리) 키 (61) 문자로 변환

const 
    CLicenseKey: array[0..61] of Word = ($0075, $0051, $006E, $005A, $0069, $0032, $0073, $0046, $0077, $0032, $0032 
    , $004C, $0030, $002D, $004D, $0052, $0061, $0038, $0070, $0059, $0058 
    , $002D, $0031, $0045, $0032, $0050, $0038, $0030, $0036, $0035, $002D 
    , $0035, $004E, $0035, $004D, $0033, $0034, $0035, $0039, $002D, $0033 
    , $0043, $0039, $0033, $0034, $0032, $0032, $0050, $0030, $002D, $004D 
    , $0030, $0034, $0039, $0036, $0039, $002D, $0036, $0035, $0036, $0032 
    , $0000); 

이 대신 포함 2로 변환

const 
    CLicenseKey: array[0..2] of Word = ($0050, $004D, $0000); 

문자 키

PM 

하나의 const를 다른 것으로 대체하고 구성 요소를 다시 컴파일하면 내 문제가 해결됩니다. 나는 무슨 일이 일어 났는지 정말로 모른다. 나는 Import/TLB가 수동으로 수정할 수있는 나쁜 .pas 파일을 생성했다는 것을 알고있다.