Vorwort
In den letzten Arbeitswochen hatte ich Probleme mit Kopfschmerzen, nämlich dass das in VB6 geschriebene ActiveX-Steuerelement in der Delphi-Umgebung viele seltsame Probleme aufweist. Nach vielen Wendungen habe ich schließlich fast alle Foren und Informationen durchsucht. , Lösungen für Probleme gefunden, die in verschiedenen Delphi-Versionen auftreten.
Eine der unerklärlichen fatalen Ausnahmen in Delphi5
Schauen wir uns zunächst das seltsame Verhalten von ActiveX-Steuerelementen an, die in VB unter Delphi5 geschrieben wurden.
Beispiel: Wir haben VB verwendet, um ein Steuerelement „UserTest“ (der Einfachheit halber exportieren wir nur eine Klasse, das Benutzersteuerelement), eine Eigenschaft „TestName“ und eine Methode „TestMethod“ zu schreiben. Kompilieren Sie es dann in ein ActiveX-Steuerelement, registrieren Sie es und importieren Sie es in die Delphi5-Entwicklungsumgebung (falls bei den oben genannten Schritten Unklarheiten bestehen, überprüfen Sie bitte verschiedene Referenzmaterialien, es müssen Standardantworten vorhanden sein). Bisher scheint alles normal zu sein.
Dann sind wir es gewohnt, Steuerelemente per Drag-and-Drop auf das Formular zu ziehen, ihre Größe zu ändern und den Eigenschaften im Eigenschaftenfenster Werte zuzuweisen. Dies ist ganz normal und einfach zu verwenden. Wenn Sie diese Testmethode jedoch mit Begeisterung aufrufen, erhalten Sie eine seltsame Ausnahme „OleError800a01a9“, und dann wird das Programm leider nicht in der Lage sein, diese Ausnahme in VB zu verfolgen in VB. Wenn Sie gut im Zusammenbau sind, können Sie dem Delphi-Debugging-Fenster natürlich Schritt für Schritt folgen ...
Als ich zum ersten Mal auf dieses Problem stieß, war ich fast wütend, weil weder Microsoft noch Borland eine Erklärung für den Fehler hatten oder Informationen finden konnten. Ich musste mehrere Foren besuchen, die ich besuchte, das wichtigste war natürlich CSDN, und ich suchte nach ähnlichen Fragen in der VB-Version und der Delphi-Version. Leider gab es nur ähnliche Fragen, aber keine Antworten. Ein großer Kunde, der diese Entwicklung nutzt Nachdem ich fast alle Entwicklungstools und Entwicklungsumgebungen unter Windows (einschließlich Desktop und WEB) getestet hatte, vergaß ich Delphi.
In den verbleibenden zwei Tagen bin ich fast um die Welt gelaufen, habe alle meine Freunde angerufen und gefragt, ob Delphi-Experten von dieser Situation wussten. Leider habe ich den genauen Standort dieses Links vergessen , aber ich habe eine fast magische Methode (so nennt der Entdecker sie):
Eine Methode zur manuellen Änderung der von Delphi nach dem Import des VBActiveX-Steuerelements generierten Proxy-Typbibliotheksdatei XXX_TLB.PAS (wobei sich XXX auf den Klassennamen des Steuerelements bezieht) kann dieses Problem lösen. Beispiel:
Es gibt ein in VB geschriebenes Steuerelement UserControl1. Nach dem Import in Delphi werden zwei Dateien generiert, UserControl1_TLB.PAS, die Datei, die wir ändern möchten.
Finden Sie so etwas in einer Datei
FintF:_UserControl1;
FunctionGetControlInterface:_UserControl1;
Und
PRpertyControlInterface:_UserControl1readGetControlInterface;
GetControlInterface;
sowie
procedureTUserControl1.CreateControl;
procedureDoCreate;
beginnen
Finf:=IUnknown(OleObject)as_UserControl1;
Ende;
Beginnen
IfFinf=nilthenDoCreate;
Ende;
FunctionTUserControl1.GetControl1Interface:_UserControl1;
Beginnen
CreateControl;
Ergebnis:=Finfl;
Ende;
Bitte beachten Sie: Alle hier rot markierten _UserControl1 müssen durch _UserControl1Disp ersetzt werden. Wenn die Kompilierung fehlschlägt, ersetzen Sie bitte alle in der Kompilierungswarnung gemeldeten _UserControl1 und kompilieren Sie auf diese Weise. Der oben genannte schwerwiegende Fehler tritt nicht auf geschehen.
Vielen Dank für diese tolle Entdeckung, ich kann es nur so beschreiben, sonst stecke ich vielleicht immer noch in diesem Kreis fest, oder ich müsste ein anderes Tool verwenden, um diese Steuerung neu zu entwickeln (ich kann mir nicht vorstellen, wie viel Arbeit das sein wird). , und Oder es kann andere Kompatibilitätsprobleme geben).
Delphi5 unerklärliche schwerwiegende Ausnahme 2
Nachdem ich diese Einschränkung umgangen hatte, ließ mich Delphi jedoch nicht los. Bald entdeckte der Kunde ein weiteres problematisches Problem. Jedes Mal, wenn das Formular mit dem Steuerelement geschlossen wurde, trat ein Fehler auf Dies geschieht zwar nicht in der kompilierten Anwendung, stellt aber ein großes Problem für Entwickler dar. Dann habe ich es anhand des obigen Beispiels versucht und festgestellt, dass dies nicht der Fall ist. (Ich bin damals verrückt geworden. Das lag wahrscheinlich an einer inkompatiblen Verwendung im Code. Es war äußerst beängstigend herauszufinden, ob Zehntausende Codezeilen an einem Tag regelmäßig waren.) Ich wurde wütend und blockierte die Steuerung Meine Kontrolle über den ganzen Code, nur die Benutzeroberfläche selbst blieb übrig, und dann passierte etwas Seltsames, ich habe keinen Code geschrieben, aber Dieser Fehler tritt immer noch beim Laden meines Steuerelements auf, was mich glücklich und überrascht macht. Das Erfreuliche ist, dass dieses Problem nichts mit meinem Code zu tun hat und daher viel einfacher zu finden ist Das Weglassen einiger Standards in VB kann tatsächlich solch schreckliche Fehler verursachen. Der Konflikt zwischen Delphi5 und VB6 ist wirklich nicht so tief. In den nächsten zwei Stunden habe ich weiterhin Steuerelemente auf der Benutzeroberfläche gelöscht, um zu testen, wer diese schwerwiegende Ausnahme verursacht hat.
Nach 2 Stunden atmete ich erleichtert auf und fand das Problem. Das grundlegende Problem ist:
Wenn Sie Container-Steuerelemente wie Frame und PictureBox (die andere Steuerelemente enthalten können) in VB-Benutzersteuerelementen verwenden, können Sie diesen Steuerelementen keine fensterlosen Steuerelemente wie Label, Line und Image hinzufügen (d. h. keine Fenstersteuerelemente). sie werden von VB in Echtzeit zur Laufzeit gezeichnet), andernfalls erhalten Sie den Fehlerbericht wie oben.
Versteckte ActiveX-Steuerelemente in Delphi6 und 7
Gerade aufgrund der schrecklichen Erfahrung unter Delphi 5 hielt ich es dennoch für notwendig, zu testen, ob das gleiche Problem auch unter Delphi 6 und 7 besteht (die Vorgängerversionen sind nicht mehr notwendig, da es nur sehr wenige Benutzer gibt, und Delphi 8 wurde nicht offiziell veröffentlicht). (noch nicht verfügbar, daher werden sie vorerst nicht berücksichtigt). Das Ergebnis ist: ... egal wie oft ich es lade, ich finde nie das lang erwartete kleine Symbol in der ActiveX-Leiste. Dieses Ergebnis ist natürlich sehr lustig, ich kann es nicht einmal laden, geschweige denn, ob der Test normal ist oder nicht.
Ebenso habe ich verschiedene Foren und Websites durchsucht und mehr Leute gefunden, die ähnliche Fragen in CSDN gestellt haben, aber die Antwort war immer noch Null. In meiner Verzweiflung musste ich die Optionen in jedem Delphi6 und 7 anpassen ...
Nach 3 Stunden, 15 Minuten und 54 Sekunden habe ich die Ursache bzw. die Lösung für dieses verdammte Problem gefunden (bitte verzeihen Sie mir, dass ich es so nenne, ich konnte es einfach nicht ertragen), was eigentlich ganz einfach ist.
Folgen Sie mir jetzt bitte: Klicken Sie auf das Menü „Extras“ -> „EnvironmentOptions“ -> „TypeLibrary“. Wir sollten ein Element finden: IgnorespecialCoClassFlagsWhenImporting, wählen Sie es aus und wählen Sie dann das Element „CanCreate“ aus. Versuchen wir nun, dieses schlechte ActiveX-Steuerelement zu importieren (es sollte so sein). Beachten Sie hier, dass Sie nach dem einmaligen Import bitte die beiden generierten Dateien .dcr und .pas löschen, da sie sonst nicht aktualisiert werden. Wenn Sie das Steuerelement dieses Mal immer noch nicht in der ActiveX-Spalte finden, müssen Sie Microsoft oder Borland anrufen und fragen, wann sie heiraten können, haha!
(Außerdem wurden die oben genannten Fehler, die in Delphi5 auftraten, in Delphi6 und 7 nicht gefunden)
Meine Testumgebung ist:
Win2K
Delphi5Update1
Delphi6Update2
Delphi7