Je suis en train de tester un contrôle ActiveX non visuel basé sur un fichier .ocx enregistré que j'importe dans Delphi à l'aide de l'assistant fourni.Contrôles ActiveX avec les anciennes versions Delphi
Ensuite, je mets simplement le composant généré sur le formulaire principal d'une nouvelle application VCL.
Sous les anciennes versions Delphi (D5 et D2007), lorsque je lance l'application, cela déclenche un AV lors de l'initialisation du composant.
avec Delphi 2009: pas de problème, l'application démarre sans problème.
Mes questions sont les suivantes:
Y at-il des améliorations connues de la gestion ActiveX dans les dernières versions de Delphi qui peut expliquer cette différence?
Puis-je suspecter un bogue dans le contrôle ActiveX ou puis-je considérer que l'origine du problème provient d'anciennes versions de Delphi?
Je dois utiliser ce composant (si les tests sont OK) dans D2007. Pensez-vous qu'il est possible de corriger le problème AV sous D2007 en modifiant le fichier .tlb généré D2007 (par exemple en essayant d'utiliser le fichier D2009 généré)
PS: le contrôle ActiveX n'est pas nommé, car mon question est une question générale sur Delphi et ActiveX, pas sur un contrôle ActiveX spécifique.
Edit:
Avec D2007, l'erreur (une violation d'accès) apparaît pendant Application.CreateForm (TForm1, Form1);
et plus particulièrement lorsque le OleControl est créé:
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;
Il pourrait aider si vous nous avez dit l'erreur ... – Leo
@Mef: OK plus d'infos sur l'erreur ajoutée. Il est étrange qu'avec D2009 TOleControl.CreateInstance (dans OleCtrls.pas) soit exactement la même fonction mais là l'appel de CoGetClassObject ne déclenche pas un AV. – DamienD