Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Registry, Dateien mit Programm verknüpfen (https://www.delphipraxis.net/41011-registry-dateien-mit-programm-verknuepfen.html)

bigg 25. Feb 2005 15:27

Re: Registry, Dateien mit Programm verknüpfen
 
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. :zwinker:

MathiasSimmack 25. Feb 2005 15:29

Re: Registry, Dateien mit Programm verknüpfen
 
Zitat:

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 ... :mrgreen:
Aber enttäuscht wg. der Thematik? Nee, ich weiß ja auch nicht alles. Viel, manchmal mehr als mir lieb ist, aber eben nicht alles ... ;)

bigg 25. Feb 2005 15:32

Re: Registry, Dateien mit Programm verknüpfen
 
Das liegt sicherlich auch daran, dass man im Netz nicht soviel darüber findet.
(Shellerweiterung)

Und schon gar nicht in Object Pascal.

Prototypjack 25. Feb 2005 16:07

Re: Registry, Dateien mit Programm verknüpfen
 
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.

bigg 25. Feb 2005 16:22

Re: Registry, Dateien mit Programm verknüpfen
 
Es wäre gut, wenn du "deinen" Quellcode besser auskommentieren würdest.
PS: Was funktioniert denn nicht genau.

Prototypjack 25. Feb 2005 16:29

Re: Registry, Dateien mit Programm verknüpfen
 
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

bigg 25. Feb 2005 16:38

Re: Registry, Dateien mit Programm verknüpfen
 
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.....

Prototypjack 25. Feb 2005 16:42

Re: Registry, Dateien mit Programm verknüpfen
 
Das Programm wird ja gestartet. Der Pfad sollte auch korrekt sein und die Parameter werden ebenfalls übergeben aber es funktioniert nicht. Nichts wird gestartet.

bigg 25. Feb 2005 16:52

Re: Registry, Dateien mit Programm verknüpfen
 
Zitat:

Das Programm wird ja gestartet .... Nichts wird gestartet.....
Was denn nun?
Wird es gestartet oder nicht?

Prototypjack 25. Feb 2005 16:54

Re: Registry, Dateien mit Programm verknüpfen
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:03 Uhr.
Seite 3 von 4     123 4      

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