![]() |
Komponenten registrieren
Liste der Anhänge anzeigen (Anzahl: 1)
Also. Ich habe in mein Delphi für ein Projekt eine recht alte Shell Komponente geladen, mit Packages etc. Jetzt gibt es beim öffnen des Projektes Probleme mit der rtl160.bpl Datei. Dannach scheint wieder alles okay zu sein. Kompilieren funktioniert. Doch wenn ich das Programm starte, kommt plötzlich Lauter accessviolation. Bei Debuggen hab ich den Haltepunkt auf die erste Zeile der FormCreate Prozedur getan. Aber die AccessViolation kam schon bevor dieses FormCreate überhaupt erreicht wurde. Nach den Access Violations kommt dann das Fenster Projekt1.exe hat ein Problem festgestellt und musste beendet werden. Problembericht Senden. Nicht Senden. Das Fenster ist ja allgemein bekannt. Ich drücke auf Nicht-Senden. Und dann komm noch eine EAccessViolation. Und dann nach einer gewissen Zeit noch irgendwie eine AccessViolation von der ShellComponent.bpl Datei. Die Datei ist übrigens das Package welches ich reingeladen habe. Beim reinladen gab es keine Probleme. Und wenn ich dieses Package rausnehme aus meinem Delphi, dann funktioniert wieder alles, aber mir fehlen halt die Komponenten aus dem Package.
Kann es sein dass ich das Package falsch geladen habe? Woran kann der Fehler liegen? Kann ich ihn irgendwie beheben ohne das Package rauszunehmen? Gibt es irgendwie ein Tutorial wie ich Komponenten registrieren kann. Weil alle Tuts die ich gefunden habe. Haben irgendwie nicht wirklich funktioniert. Im Anhang sind die 3 Units aus denen das Package besteht. |
AW: Komponenten registrieren
FormCreate Das OnCreate-Ereignis ist nicht mit dem Create Constructor einer Klasse vergleichbar.
OnCreate wird ausgeführt, nachdem das Formular geladen wurde, also nachdem alle darauf enthaltenen Komponenten erstellt wurden. Und vorher wurden auch noch alle möglichen Unit-Initialisierungen ausgeführt. Da wirst du also früher anfangen, mit dem Debuggen. Oder du baust einfach solange alles aus, bis es funktioniert und versuchst so das Problem einzugrenzen. |
AW: Komponenten registrieren
Liste der Anhänge anzeigen (Anzahl: 1)
Ein kurzer Blick zeigt, dass das Unicodeprobleme sind. Die Unit lässt sich so ja auch gar nicht kompilieren. Zuerst müssen die Verben in Ansizeichen geändert werden. Wie du mit der Unit überhaupt bis zur Schutzverletzung gekommen bist, ist mir ein Rätsel... (Hast du da vielleicht eine falsche Version gepostet? :roll:) Änderungen sind markiert...
Delphi-Quellcode:
Dann erst kommt die Schutzverletzung. Die wiederum wird genau an der richtigen Stelle angezeigt, so dass das Problem schnell zu sehen ist. Da hat der Autor einen hässlichen Fehler gemacht:
function ContextMenuCommand(ContextMenu: IContextMenu; idCmd: Cardinal): string;
var ZVerb: array[0..255] of AnsiChar; // changed begin ZVerb[0] := #0; if ContextMenu.GetCommandString(idCmd, GCS_VERB, nil, ZVerb, SizeOf(ZVerb)) = S_OK then Result := ZVerb else Result := ''; end; procedure ContextMenuVerb(Handle: THandle; ContextMenu: IContextMenu; Verb: PChar); var CMInvokeCommandInfo: TCMInvokeCommandInfo; AnsiVerb: AnsiString; // added begin FillChar(CMInvokeCommandInfo, SizeOf(CMInvokeCommandInfo), 0); with CMInvokeCommandInfo do begin cbSize := SizeOf(CMInvokeCommandInfo); hwnd := Handle; AnsiVerb := AnsiString(Verb); // added lpVerb := PAnsiChar(AnsiVerb); // changed nShow := SW_SHOWNORMAL; end; ContextMenu.InvokeCommand(CMInvokeCommandInfo); end; procedure ContextMenuHint(ContextMenu: IContextMenu; Msg: TWMMenuSelect); var idCmd: Cardinal; ZVerb: array[0..255] of AnsiChar; // changed S: string; begin Anhang 36690 Wie man sehen kann passiert der Fehler beim Durchiterieren der ID-Liste. Wenn man dann mal schaut wie dies passiert, sieht man auch warum es knallt:
Delphi-Quellcode:
Hier wurde als schmutziger Trick PChar benutzt um Inc auf den Pointer anwenden zu können... PByte gab es damals zwar noch nicht, aber das ist deshalb nicht weniger schlecht. Jedenfalls musst du dort nur PChar in PByte ändern, damit wirklich die Anzahl Bytes weitergegangen wird und nicht doppelt so viel...
function NextPIDL(PIDL: PItemIDList): PItemIDList;
begin Result := PIDL; Inc(PChar(Result), PIDL^.mkid.cb); end; |
AW: Komponenten registrieren
Das mit dem PAnsiChar hab ich gemacht. Aber den Rest hätte ich nie im Leben sehen können. Die Unit ist wie gesagt von Ariesoft geschrieben. Und eigentlich für Delphi 6 oder ähnliches gedacht.
ich schau mal was passiert wenn ich das umänder. Die stelle mit dem PDIL hatte ich auch schon beim debuggen gefunden aber konnte nichts damit anfangen. Und noch eine Frage. Macht es einen großen unterschied ob ich die Komponenten als Package reinlade oder einfach nur mit den (geänderten) Units arbeite und die Objekte mithilfe von Quelltext erstelle? |
AW: Komponenten registrieren
Es funktioniert (:
Danke danke danke. |
AW: Komponenten registrieren
Zitat:
Wenn du die Dateien dynamisch erstellst, hast du nur einmal etwas mehr Code zu schreiben, danach aber deutlich weniger Mühe. Letztlich muss das jeder für sich selbst entscheiden wann man welche Methode benutzt. Ich persönlich erstelle Komponenten, die ich nur selten verwende, lieber manuell. Komponenten, die anderen Komponenten in Eigenschaften zugeordnet werden (Datenbankkomponenten, ...) oder solche, die ich oft verwende, installiere ich in der Regel in Packages und benutze sie visuell. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz