AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Komponenten registrieren

Ein Thema von Informatik2012 · begonnen am 9. Apr 2012 · letzter Beitrag vom 9. Apr 2012
Antwort Antwort
Informatik2012

Registriert seit: 30. Mai 2011
30 Beiträge
 
#1

Komponenten registrieren

  Alt 9. Apr 2012, 16:44
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.
Angehängte Dateien
Dateityp: 7z Source.7z (21,7 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Komponenten registrieren

  Alt 9. Apr 2012, 17:07
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Komponenten registrieren

  Alt 9. Apr 2012, 17:12
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? ) Änderungen sind markiert...
Delphi-Quellcode:
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
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:

as_shellpackxe2.png

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:
function NextPIDL(PIDL: PItemIDList): PItemIDList;
begin
  Result := PIDL;
  Inc(PChar(Result), PIDL^.mkid.cb);
end;
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...
Sebastian Jänicke
AppCentral

Geändert von jaenicke ( 9. Apr 2012 um 17:14 Uhr)
  Mit Zitat antworten Zitat
Informatik2012

Registriert seit: 30. Mai 2011
30 Beiträge
 
#4

AW: Komponenten registrieren

  Alt 9. Apr 2012, 17:24
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?
  Mit Zitat antworten Zitat
Informatik2012

Registriert seit: 30. Mai 2011
30 Beiträge
 
#5

AW: Komponenten registrieren

  Alt 9. Apr 2012, 17:32
Es funktioniert (:
Danke danke danke.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Komponenten registrieren

  Alt 9. Apr 2012, 17:35
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?
Es hat beides Vor- und Nachteile. Wenn du die Komponente über Packages installierst, ist der Aufwand beim Einrichten einer neuen Delphiinstallation oder bei der Weitergabe des Codes umständlicher.
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz