AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Registry, Dateien mit Programm verknüpfen
Thema durchsuchen
Ansicht
Themen-Optionen

Registry, Dateien mit Programm verknüpfen

Ein Thema von Prototypjack · begonnen am 24. Feb 2005 · letzter Beitrag vom 25. Feb 2005
Antwort Antwort
Seite 3 von 4     123 4      
bigg
(Gast)

n/a Beiträge
 
#21

Re: Registry, Dateien mit Programm verknüpfen

  Alt 25. Feb 2005, 16:27
Da muß ich dich leider enttäuschen, Mathias.
Es ist zwar möglich aber nich schnell genug.

Für die einfache Variante:
Wenn du dem Programm 1000 Parameter übergeben möchtest, heißt das für den Explorer:
Starte 1000 mal das Programm. Du hast dann nur eine Anwendung offen, aber das ständige
Starten drückt auf die Zeit.

DLL-Variante:
Der Explorer übergibt alle Dateinamen an eine Shell-DLL weiter,
von der DLL aus, sendest du alle Paramter an deine Hauptanwendung.
Das heißt 1x Starten und viel viel Zeit sparen.

Deswegen benutzen auch Packer eine Shell-Erweiterung.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#22

Re: Registry, Dateien mit Programm verknüpfen

  Alt 25. Feb 2005, 16:29
Zitat von bigg:
Da muß ich dich leider enttäuschen, Matthias.
Ich bin gar nicht enttäuscht. Na ja, höchstens über das T, das zuviel ist ...
Aber enttäuscht wg. der Thematik? Nee, ich weiß ja auch nicht alles. Viel, manchmal mehr als mir lieb ist, aber eben nicht alles ...
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#23

Re: Registry, Dateien mit Programm verknüpfen

  Alt 25. Feb 2005, 16:32
Das liegt sicherlich auch daran, dass man im Netz nicht soviel darüber findet.
(Shellerweiterung)

Und schon gar nicht in Object Pascal.
  Mit Zitat antworten Zitat
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#24

Re: Registry, Dateien mit Programm verknüpfen

  Alt 25. Feb 2005, 17:07
Das habe ich bisher.
irgendwie will der code aber nicht so richtig, kann sich den mal jemand ansehen?
Danke schonmal
Delphi-Quellcode:
unit main;

interface

uses
  ComServ, SysUtils, ShellAPI, Registry, Classes, Windows, ActiveX, ComObj, ShlObj, Graphics, Dialogs;

const
  GUID_Tnp2cont: TGUID = '{44FC978E-C20B-42D2-A6BD-DD3968D43172}';

type
  Tnp2cont = class(TComObject, IShellExtInit, IContextMenu)
    protected
      function IShellExtInit.Initialize = SEInitialize;
      function SEInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject; hKeyProgID: HKEY): HResult; stdcall;
      function QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst, idCmdLast, uflags: UINT): HResult; stdcall;
      function InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; stdcall;
      function GetCommandString(idCmd, uType: UINT; pwReserved: PUINT; pszName: LPSTR; cchMax: UINT): HResult; stdcall;
  end;

implementation

var
  FFileName: array[0..MAX_PATH] of Char;
  hBmp: TBitmap;

type
  Tnp2contFactory = class(TComObjectFactory)
    public
      procedure UpdateRegistry(Register: boolean); override;
  end;

function Tnp2cont.SEInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
  hKeyProgID: HKEY): HResult;
var
  StgMedium: TStgMedium;
  FormatEtc: TFormatEtc;
begin
  if (lpdobj = nil) then begin
    Result := E_INVALIDARG;
    Exit;
  end;

  with FormatEtc do begin
    cfFormat := CF_HDROP;
    ptd := nil;
    dwAspect := DVASPECT_CONTENT;
    lindex := -1;
    tymed := TYMED_HGLOBAL;
  end;
  Result := lpdobj.GetData(FormatEtc, StgMedium);
  if Failed(Result) then
    Exit;
  if (DragQueryFile(StgMedium.hGlobal, $FFFFFFFF, nil, 0) = 1) then begin
    DragQueryFile(StgMedium.hGlobal, 0, FFileName, SizeOf(FFileName));
    Result := NOERROR;
  end
  else begin
    FFileName[0] := #0;
    Result := E_FAIL;
  end;
  ReleaseStgMedium(StgMedium);
end;

function Tnp2cont.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst,
          idCmdLast, uFlags: UINT): HResult;
begin
  Result := 0;

  if ((uFlags and $0000000F) = CMF_NORMAL) or
     ((uFlags and CMF_EXPLORE) <> 0) then begin

    InsertMenu(Menu, indexMenu, MF_STRING or MF_BYPOSITION, idCmdFirst,
      'Mit NotePad2 bearbeiten');

    Result := 1;
  end;
end;

function Tnp2cont.InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult;
resourcestring
  sPathError = 'Error setting current directory';

var
  H: THandle;
  PrevDir: string;
  
begin
  Result := E_FAIL;
  if (HiWord(Integer(lpici.lpVerb)) <> 0) then
  begin
    Exit;
  end;
  if (LoWord(lpici.lpVerb) <> 0) then begin
    Result := E_INVALIDARG;
    Exit;
  end;
  PrevDir := GetCurrentDir;
  try
    if not SetCurrentDir(ExtractFilePath(FFileName)) then
      raise Exception.CreateRes(@sPathError);

    H := WinExec(PChar(Format(extractfilepath(paramstr(0))+'notepad2.exe', [FFileName])), lpici.nShow);

    if (H < 32) then
      MessageBox(lpici.hWnd, 'NotePad2 konnte nicht gestartet werden.', 'Error',
        MB_ICONERROR or MB_OK);
    Result := NOERROR;
  finally
    SetCurrentDir(PrevDir);
  end;
end;

function Tnp2cont.GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;
  pszName: LPSTR; cchMax: UINT): HResult;
begin
  if (idCmd = 0) then begin
    if (uType = GCS_HELPTEXT) then
      // return help string for menu item
      StrCopy(pszName, 'Diese Datei mit NotePad2 bearbeiten.');
    Result := NOERROR;
  end
  else
    Result := E_INVALIDARG;
end;

procedure Tnp2contfactory.UpdateRegistry(Register: Boolean);
var
  ClassID: string;
begin
  if Register then begin
    inherited UpdateRegistry(Register);

    ClassID := GUIDToString(GUID_Tnp2cont);
    CreateRegKey('*\shellex', '', '');
    CreateRegKey('*\shellex\ContextMenuHandlers', '', '');
    CreateRegKey('*\shellex\ContextMenuHandlers\DFKontextMenu', '', ClassID);

    if (Win32Platform = VER_PLATFORM_WIN32_NT) then
      with TRegistry.Create do
        try
          RootKey := HKEY_LOCAL_MACHINE;
          OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions', True);
          OpenKey('Approved', True);
          WriteString(ClassID, 'NP2');
        finally
          Free;
        end;
  end
  else begin
    DeleteRegKey('*\shellex\ContextMenuHandlers\DFKontextMenu');
    DeleteRegKey('*\shellex\ContextMenuHandlers');
    DeleteRegKey('*\shellex');

    inherited UpdateRegistry(Register);
  end;
end;

initialization
  // hier wird die Erweiterung registriert
  Tnp2contFactory.Create(ComServer, Tnp2cont, GUID_Tnp2cont,
    '', 'NotePad2', ciMultiInstance, tmApartment);
  hBmp := TBitmap.Create;
  // Bild aus Ressourcendatei laden (der Name der Bildressource muss als 2. Parameter angegeben
  // werden - auf keinen Fall den DefaultNamen belassen, den der Bildeditor vergibt!
  hBmp.LoadFromResourceName(hInstance, 'NOTEPAD2');
finalization
  // Bitmap wieder freigeben
  hBmp.Free;

end.
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#25

Re: Registry, Dateien mit Programm verknüpfen

  Alt 25. Feb 2005, 17:22
Es wäre gut, wenn du "deinen" Quellcode besser auskommentieren würdest.
PS: Was funktioniert denn nicht genau.
  Mit Zitat antworten Zitat
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#26

Re: Registry, Dateien mit Programm verknüpfen

  Alt 25. Feb 2005, 17:29
Alles scheint zu funzen bis auf Invokecommand(Wird ausgeführt wenn das Item angeklickt wird) Da sollte dann mein Prog mit Params. starten
Sry wegen der Commentierung.
Gruß,
Max
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#27

Re: Registry, Dateien mit Programm verknüpfen

  Alt 25. Feb 2005, 17:38
Du mußt dir jetzt irgendwie den Programmpfad deines Editors holen.
Ich speichere den Programmpfad in der Registry.

Außerdem mußt du nun feststellen, ob dein Programm bereits läuft.
Wenn es läuft sendest du eine Nachricht mit allen Parametern an dein Programm.

Ansonsten mußt du eben dein Programm starten und solange warten, bis es gestartet ist.
Und anschließend senden.....
  Mit Zitat antworten Zitat
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#28

Re: Registry, Dateien mit Programm verknüpfen

  Alt 25. Feb 2005, 17:42
Das Programm wird ja gestartet. Der Pfad sollte auch korrekt sein und die Parameter werden ebenfalls übergeben aber es funktioniert nicht. Nichts wird gestartet.
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#29

Re: Registry, Dateien mit Programm verknüpfen

  Alt 25. Feb 2005, 17:52
Zitat:
Das Programm wird ja gestartet .... Nichts wird gestartet.....
Was denn nun?
Wird es gestartet oder nicht?
  Mit Zitat antworten Zitat
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#30

Re: Registry, Dateien mit Programm verknüpfen

  Alt 25. Feb 2005, 17:54
Achso sorry,
Ich wollte sagen die DLL wird richtig abgearbeitet bis zum Punkt wo das Programm starten soll. Naja die Parameter sollte richtig sein und der Pfad auch aber das Programm wird nicht gestartet und die vorgefertigte Fehlermeldungwird ausgegeben.
Gruß,
max
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 03:39 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