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
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.055 Beiträge
 
Delphi 12 Athens
 
#1

AW: Komponenten registrieren

  Alt 9. Apr 2012, 16: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 16:14 Uhr)
  Mit Zitat antworten Zitat
Informatik2012

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

AW: Komponenten registrieren

  Alt 9. Apr 2012, 16: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
 
#3

AW: Komponenten registrieren

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

Registriert seit: 10. Jun 2003
Ort: Berlin
10.055 Beiträge
 
Delphi 12 Athens
 
#4

AW: Komponenten registrieren

  Alt 9. Apr 2012, 16: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 02:00 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